#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
vector<int> V[205];
int vstd[205],pre[205];
int c[205][205],f[205][205],cf[205][205];
const int maxn=0x7fffffff;
int main()
{
int n,m;
while (scanf("%d",&n)!=EOF)
{
long long ans=0;
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
memset(cf,0,sizeof(cf));
scanf("%d",&m);
int i;
for (i=1;i<=m;i++)
V[i].clear();
for (i=0;i<n;i++)
{
int a,b,x;
scanf("%d%d",&a,&b);
scanf("%d",&x);
if (!c[a][b])
{
V[a].push_back(b);
V[b].push_back(a);
}
c[a][b]+=x;
}
while (1)
{
memset(vstd,0,sizeof(vstd));
memset(pre,0,sizeof(pre));
queue<int> Q;
Q.push(1);
vstd[1]=1;
pre[1]=0;
while (!Q.empty())
{
int front=Q.front();
if (front==m)
break;
for (i=0;i<(int)V[front].size();i++)
{
int next=V[front][i];
cf[front][next]=c[front][next]-f[front][next];
if (!vstd[next] && cf[front][next]>0)
{
Q.push(next);
vstd[next]=1;
pre[next]=front;
}
}
Q.pop();
}
if (Q.empty()) break;
else
{
int x=m;
int minCf=maxn;
while (pre[x])
{
int a=pre[x],b=x;
cf[a][b]=c[a][b]-f[a][b];
if (cf[a][b]<minCf)
minCf=cf[a][b];
x=pre[x];
}
ans+=minCf;
x=m;
while (pre[x])
{
int a=pre[x],b=x;
f[a][b]+=minCf;
f[b][a]=-f[a][b];
x=pre[x];
}
}
}
cout << ans << endl;
}
}
POJ1273(最大流入门)
最新推荐文章于 2018-08-15 11:16:52 发布