分析:此题从1即为S,m即为t.求最大流。但是输入可能有重复,这里很关键。因为没注意重边导致WA了。这个题目很经典,可以用EK,FF,DINIC求最大流。
代码:
#include<iostream>
#include<queue>
using namespace std;
int net[210][210],m,n,pre[210];
queue<int>q;
bool bfs()
{
int v,i;
bool visit[210];
int flow[210];
memset(flow,-1,sizeof(flow));
memset(visit,0,sizeof(visit));
while(!q.empty()) q.pop();
q.push(1);
visit[1]=true;
flow[1]=(1<<30);pre[1]=1;
while(!q.empty())
{
v=q.front();
q.pop();
for(i=1;i<=n;i++)
if(!visit[i]&&net[v][i])
{
flow[i]=flow[v]<net[v][i]?flow[v]:net[v][i];
q.push(i);
visit[i]=true;
pre[i]=v;
}
}
if(flow[n]==-1) return 0;
return flow[n];
}
int Edmonds_Karp()
{
int _min,total=0;
while(_min=bfs())
{
int np=n,pp;
while(np!=1)
{
pp=pre[np];
net[pp][np]-=_min;
net[np][pp]+=_min;
np=pp;
}
total+=_min;
}
return total;
}
int main()
{
int i,x,y,z;
while (scanf("%d%d",&m,&n)!=EOF)
{
int x,y,R;
memset(net,0,sizeof(net));
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
scanf("%d",&R);// pay attention to!
net[x][y]+=R;
}
printf("%d\n",Edmonds_Karp());
}
return 0;
}