最大流这个问题困扰了好久,终于搞明白了。。。
其实就是宽度搜索,直到找不到通往目的节点的路。
贴代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<queue>
#define N 205
using namespace std;
int pre[N];
int flow[N];
int map[N][N];
int start,endx,n,m;
const int INF=0x7FFFFFFF;
int bfs()
{
flow[start]=INF;
queue<int> myqueue;
int tmp,i,add;
// while(!myqueue.empty())
// myqueue.pop();
memset(pre,-1,sizeof(pre));
pre[start]=0;
myqueue.push(start);
while(!myqueue.empty())
{
tmp=myqueue.front();
myqueue.pop();
if(tmp==endx)
break;
for(i=1;i<=m;i++)
{
if(i!=start&&pre[i]==-1&&map[tmp][i])
{
pre[i]=tmp;
flow[i]=flow[tmp]<map[tmp][i]?flow[tmp]:map[tmp][i];
myqueue.push(i);
}
}
}
if(pre[endx]==-1)
return -1;
else
return flow[endx];//找到一条通往目的节点的路,通过pre[]数组连在一起
}
int E_K()
{
int add,t,temp;
memset(flow,0,sizeof(flow));
int maxflow=0;
while(add=bfs()!=-1)
{
t=endx;
maxflow+=add;
while(t!=start)
{
temp=pre[t];
map[temp][t]-=add;//这条路上每段正向弧减去流
map[t][temp]+=add;
t=temp;
}
}
return maxflow;
}
int main()
{
int u,v,cost;
while(scanf("%d%d",&n,&m)!=EOF){
memset(map,0,sizeof(map));
int i;
for(i=0;i<n;i++){
scanf("%d%d%d",&u,&v,&cost);
map[u][v]+=cost;
}
start=1,endx=m;
printf("%d\n",E_K());
}
return 0;
}