POJ-1273 朴素的最大流

本文深入探讨了残余网络的概念及其在解决流量分配问题中的应用。通过使用广度优先搜索算法,实现了一个高效的流量分配系统,显著提高了网络资源的利用效率。
/*
 * 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值