poj 1273 Drainage Ditches

题目大意:对于一个排水系统,求它的最大排水速度。

即最大流,用的是标号增广路算法。

#include <stdio.h>
#include <string.h>
#include <math.h>
#define INF 100000000
int min(int a,int b)
{
	if(a>b)
		return b;
	else
		return a;
}
struct node
{
	int c,f;
}map[210][210];

int m,n,flag[210],prev[210],alpha[210];
int queue[300];
int qs,qe,v;
void ford()
{
	int i;
	while(1)
	{
		memset(flag,-1,sizeof(flag));
		memset(alpha,-1,sizeof(alpha));
		memset(prev,-1,sizeof(prev));
		flag[1]=0;prev[1]=1;alpha[1]=INF;
		qs=0;qe=1;
		queue[0]=1;
		while(qs<qe&&flag[n]==-1)
		{
			v=queue[qs]; qs++;
			for(i=1;i<=n;i++)
			{
				if(flag[i]==-1)
				{
					if(map[v][i].c<INF&&map[v][i].f<map[v][i].c)
					{
						flag[i]=0;
						prev[i]=v;
						alpha[i]=min(alpha[v],map[v][i].c-map[v][i].f);
						queue[qe++]=i;
					}
					else if(map[i][v].c<INF&&map[i][v].f>0)
					{
						flag[i]=0;
						prev[i]=-v;
						alpha[i]=min(alpha[v],map[i][v].f);
						queue[qe++]=i;
					}
				}
			}
			flag[v]=1;
		}
		if(flag[n]==-1||alpha[n]==0)
			break;
		int k1=n,k2=abs(prev[k1]);
		int a=alpha[n];
		while(1)
		{
			if(map[k2][k1].f<INF)
				map[k2][k1].f+=a;
			else map[k1][k2].f-=a;
			if(k2==1)
				break;
			k1=k2;
			k2=abs(prev[k2]);
		}
	}
	int max=0;
	for(i=2;i<=n;i++)
	{
		if(map[1][i].c<INF)
			max+=map[1][i].f;
		if(map[i][1].c<INF)
			max-=map[i][1].f;

	}
	printf("%d
",max);
}

int main()
{
	int i,j;
	int x,y,w;
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				map[i][j].c=INF;
				map[i][j].f=0;
			}
		for(i=0;i<m;i++)
		{
			scanf("%d%d%d",&x,&y,&w);
			if(map[x][y].c<INF)
				map[x][y].c+=w;
			else
				map[x][y].c=w;
		}
		ford();
	}
	return 0;
}


 

 

原文地址:https://www.cnblogs.com/vermouth/p/3710210.html