POJ-1273 朴素的最大流

来源:互联网 发布:win10桌面软件图标 编辑:程序博客网 时间:2024/06/09 14:23
/* * 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_JUDGEfreopen("1273.in","r",stdin);#endifwhile(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]=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;}


原创粉丝点击