题目链接: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;
}