/*
* 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]=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;
}
POJ-1273 朴素的最大流
最新推荐文章于 2026-01-10 11:44:38 发布
本文深入探讨了残余网络的概念及其在解决流量分配问题中的应用。通过使用广度优先搜索算法,实现了一个高效的流量分配系统,显著提高了网络资源的利用效率。
972

被折叠的 条评论
为什么被折叠?



