HDU1532 Drainage Ditches 最大流

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532

 

题目大意:

      就是由于下大雨的时候约翰的农场就会被雨水给淹没,无奈下约翰不得不修建水沟,而且是网络水沟,并且聪明的约翰还控制了水的流速,本题就是让你求出最大流速,无疑要运用到求最大流了。题中m为水沟数,n为水沟的顶点,接下来Si,Ei,Ci分别是水沟的起点,终点以及其容量。求源点1到终点n的最大流速。注意重边

 

用到的知识:一般增光路算法---Ford-Fulkerson方法

 

参考代码:

 

 

#include<iostream>
using namespace std;
#include<cmath>
#define MIN(a,b) a<b?a:b
#define INF  1000000
struct node
{
	int c;
	int f;
}edge[205][205];
int m,n;
int qs,qe;
int flag[205],pre[205],alpha[205];
int v,queue[205];
void BFS()
{
	memset(flag,0xff,sizeof(flag));
	memset(pre,0xff,sizeof(pre));
	memset(alpha,0xff,sizeof(alpha));
	flag[1]=0;
	pre[1]=0;
	alpha[1]=INF;
	qs=qe=0;
	queue[qe]=1;
	qe++;
	while(qs<qe&&flag[n]==-1)
	{
		int i;
		v=queue[qs];
		qs++;
		for(i=1;i<=n;i++)
		{
			if(flag[i]==-1)
			{
				if(edge[v][i].c<INF&&edge[v][i].c>edge[v][i].f)
				{
					flag[i]=0;
					pre[i]=v;
					alpha[i]=MIN(alpha[v],edge[v][i].c-edge[v][i].f);
						queue[qe]=i;
					qe++;
				}
				else if(edge[i][v].c<INF&&edge[i][v].f>0)
				{
					flag[i]=0;
					pre[i]=-v;
					alpha[i]=MIN(alpha[v],edge[i][v].f);
					queue[qe]=i;
					qe++;
				}
			}
		}
		flag[v]=1;
	}
}
void Ford_Fullkerson()
{
	while(1)
	{
		BFS();
		if(alpha[n]==0||flag[n]==-1)
			break;
		int k1=n;
		int k2=abs(pre[k1]);
		int a=alpha[k1];
		while(1)
		{
			if(edge[k2][k1].f<INF)
				edge[k2][k1].f+=a;
			else
				edge[k1][k2].f-=a;
			if(k2==0)
				break;
			k1=k2;
			k2=abs(pre[k2]);
		}
		alpha[n]=0;
	}
}
void Max()
{
	int i,j;
	int sum=0;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(i==1&&edge[i][j].f<INF)
				sum+=edge[i][j].f;
		}
	}
	cout<<sum<<endl;
}
int main()
{
	int A,B,C;
	while(cin>>m>>n)
	{
		memset(edge,0,sizeof(edge));
		while(m--)
		{
			cin>>A>>B>>C;
			edge[A][B].c+=C;
		}
		Ford_Fullkerson();
		Max();
	}
	return 0;
}


 

 

你可能感兴趣的:(HDU1532 Drainage Ditches 最大流)