您的位置:首页 > 理论基础 > 计算机网络

POJ 1273 Drainage Ditches 一般增广路算法,网络流

2013-04-08 20:25 435 查看
看到Ci最大可以到10 000 000,N<=200,M<=200,我以为用这个算法会超时,据说该算法的复杂度是N*M*C,C为最大流量值。

但是显然没超,可能是数据弱神马的,不知道

没什么思路说的,就是裸的网络最大流,我的代码和上一个题 pigs(麦克卖猪)的代码基本上相同,下面贴代码:

View Code

#include <cstdio>
#include <cstring>
#define MAXN 205
#define MAXM 205
#define INF 300000000
struct Arc
{
int c,f;
} edge[MAXN][MAXN];
int n,m;
void init()
{
int i;
memset(edge,0,sizeof(edge));
for(i =0; i < m; ++i)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
edge[u][v].c += c;
}
}
void Ford()
{
int prev[MAXN];
int alpha[MAXN];
int queue[MAXN];
int i,j;
while(1)
{
int front=0,tail=0;
memset(prev,0xff,sizeof(prev));
queue[tail++] = 1;
alpha[1] = INF;
prev[1] = -2;
while(front != tail && prev
== -1)
{
int v = queue[front++];
for(i = 1; i <= n; i++)
{
int tmp;
if(prev[i] == -1 && (tmp = edge[v][i].c-edge[v][i].f))
{
prev[i] = v;
queue[tail++] = i;
alpha[i] = alpha[v] < tmp ? alpha[v]:tmp;
}
}
}
if(prev
== -1) break;
for(i = prev
,j = n; i != -2; j = i, i = prev[i])
{
edge[i][j].f += alpha
;
edge[j][i].f = -edge[i][j].f;
}
}
int p=0;
for(i=1; i<n; i++)
p += edge[i]
.f;
printf("%d\n",p);
}
int main()
{
//    freopen("in.cpp","r",stdin);
while(~scanf("%d%d",&m,&n))
{
init();
Ford();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: