题意:现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条水渠,给出这n条水渠所连接的点和所能流过的最大流量;
思路:最大流EK算法,注意有重边;
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=205;
const int maxn=0xfffffff;
int map[N][N],vis[N],pre[N];
int n,m;
int bfs(int s,int t)
{
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));
queue<int>que;
que.push(s);
vis[s]=1;
while(que.size())
{
int q=que.front();
que.pop();
for(int i=1;i<=n;i++)
{
if(map[q][i]&&!vis[i])
{
pre[i]=q;
vis[i]=1;
if(i==t)
return 1;
que.push(i);
}
}
}
return 0;
}
int EK(int s,int t)
{
memset(vis,0,sizeof(vis));
int sum=0;
while(bfs(s,t))
{
int ti=maxn;
for(int i=t;i!=s;i=pre[i])
ti=min(ti,map[pre[i]][i]);
for(int i=t;i!=s;i=pre[i])
{
map[pre[i]][i]-=ti;
map[i][pre[i]]+=ti;
}
sum+=ti;
}
return sum;
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
memset(map,0,sizeof(map));
for(int i=1;i<=m;i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
map[a][b]+=w;
}
printf("%d\n",EK(1,n));
}
}