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

POJ-1273 朴素的最大流

2011-10-05 12:21 417 查看
/*
* poj-1273 ditch
* mike-w
* 2011-10-5
* -----------------
* 今天我才发现,我对残余网络理解有误!
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#ifndef true
#define true (1)
#endif
#define SIZE 222
#define QSIZE (2*SIZE)
long que[QSIZE],head,tail;
long f[SIZE][SIZE],res[SIZE][SIZE];
int prev[SIZE];
int N,M;

int main(void)
{
int i,j,node,t1,t2;
long total,t3,delta;

#ifndef ONLINE_JUDGE
freopen("1273.in","r",stdin);
#endif

while(scanf("%d%d",&M,&N)!=EOF)
{
memset(res,0,sizeof(res));
memset(f,0,sizeof(f));
total=0;

for(i=0;i<M;i++)
scanf("%d%d%ld",&t1,&t2,&t3),
res[t2][t1]+=t3;	/* initially, there is no flow in f */

while(true)
{
/* find a augmenting path */
head=tail=0;
memset(prev,0,sizeof(prev));
que[tail++]=N;
if(tail==QSIZE) tail=0;
prev
=N;
while(head!=tail)
{
node=que[head++];
if(node==1) break;
if(head==QSIZE) head=0;
for(i=1;i<=N;i++)
if(res[node][i] && !prev[i])
{
que[tail++]=i;
if(tail==QSIZE) tail=0;
prev[i]=node;
}
}
/* S and T are not connected in residual network */
if(!prev[1]) break;
/* find the valid delta */
delta=(1<<30);
for(node=1;node!=N;node=prev[node])
if(res[prev[node]][node]<delta)
delta=res[prev[node]][node];
for(node=1;node!=N;node=prev[node])
res[prev[node]][node]-=delta,
res[node][prev[node]]+=delta,
f[node][prev[node]]+=delta;
/* record the improvement */
total+=delta;
}
printf("%ld\n",total);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  network path 网络