您的位置:首页 > 其它

HDU3549 Flow Problem(最大流)

2016-03-13 12:05 330 查看
给你一个网络流的图,求出它的最大流,当个模板练习吧

#include<cstdio>
#include<cstring>
#define MAXN 50
using namespace std;
int c[MAXN][MAXN],d[MAXN],vd[MAXN],flow,n,m,s,t,x,y,z;
inline int Min(int a,int b)
{return a<b?a:b;}
int aug(int i,int augco)
{
int j,augc = augco,mind = n-1,delta;
if(i == n) return augco;
for(j = 1; j <= n; j++)
if(c[i][j] > 0)
{
if(d[i] == d[j]+1)
{
delta = Min(c[i][j],augc);
delta = aug(j,delta);
c[i][j] -= delta;
c[j][i] += delta;
augc -= delta;
if(d[1] >= n) return augco-augc;
if(augc == 0) break;
}
if(d[j] < mind) mind = d[j];
}
if(augc == augco)
{
vd[d[i]]--;
if(vd[d[i]] == 0) d[1] = n;
d[i] = mind+1;
vd[d[i]]++;
}
return augco-augc;
}
void sap()
{
flow = 0;
memset(d,0,sizeof d);
memset(vd,0,sizeof vd);
vd[0] = n;
while(d[1] < n)
flow += aug(1,0x3f3f3f3f);
}
int main()
{
int T;
scanf("%d",&T);
for(int k = 1; k <= T; k++)
{
scanf("%d%d",&n,&m);
memset(c,0,sizeof c);
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d",&x,&y,&z);
c[x][y] += z;
}
sap();
printf("Case %d: %d\n",k,flow);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: