本题为网络流中最水的最大流问题,,,我用的是EDmonds karp 算法,。,,主要是寻找增光路。。。首先从第一个点出发,,,然后用广搜往下进行。,,将沿途所有点设为前边路径的最小值。。。接下来,,,回溯以前的点。。。将流量替换为盛余留,,,
题目连接
http://poj.org/problem?id=1273
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int INF = 0x7FFFFFFF;
int end,st[210][210],m,n,fl[210],vi[210];
queue<int> q;
int dfs()
{
while(!q.empty())
q.pop();
q.push(1);
fl[1]=INF;
memset(vi,0,sizeof(vi));
vi[1]=1;
while(!q.empty())
{
int t=q.front();
q.pop();
if(t==n)
break;
for(int i=1;i<=n;i++)
{
if(i!=1&&!vi[i]&&st[t][i])
{
fl[i]=fl[t]<st[t][i]?fl[t]:st[t][i];
vi[i]=t;
q.push(i);
}
}
}
if(vi[n]==0)
return 0;
return fl[n];
}
int ed()
{
int max=0,xz,qb,ste;
while((ste=dfs())!=0)
{
max+=ste;
xz=n;
while(xz!=1)
{
qb=vi[xz];
st[qb][xz]-=ste;
st[xz][qb]+=ste;
xz=qb;
}
}
return max;
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
int a,b,c;
memset(st,0,sizeof(st));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
st[a][b]+=c;
}
printf("%d\n",ed());
}
return 0;
}