poj 1273 Drainage Ditches--网络流

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int map[201][210];
int n,m;
int f[210];
int pre[210];
int bfs()//广搜找增广路径
{
	queue<int>q;
	int top,i;
	memset(pre,-1,sizeof(pre));//置前驱
	f[1]=999999999;//流到这儿的可增大的流
	q.push(1);
	pre[1]=0;
	while(!q.empty())
	{
		top=q.front();
		q.pop();
		if(top==m)
			break;
		for(i=1;i<=m;i++)
		{
			if(pre[i]==-1&&map[top][i])//未访问,可流
			{
				f[i]=f[top]<map[top][i]?f[top]:map[top][i];
				pre[i]=top;
				q.push(i);
			}
		}
	}
	if(pre[m]==-1) return 0;//若为访问到汇点
	return f[m];
}
int ek()
{
	int maxf=0,addf,cur,pree;
	while(addf=bfs(),addf!=0)//若找到增广路径
	{
		maxf+=addf;
		cur=m;
		while(cur!=1)//修改残留网络
		{
			pree=pre[cur];
			map[pree][cur]-=addf;//正向的因占用流,其残余流减少
			map[cur][pree]+=addf;//其反向的,表示可改流增加
			cur=pree;
		}
	}
	return maxf;
}
int main()
{
	int ret,i,u,v,c;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		memset(map,0,sizeof(map));
		for(i=0;i<n;i++)
		{
			scanf("%d%d%d",&u,&v,&c);
			map[u][v]+=c;//流是有向的
		}
		ret=ek();
		printf("%d\n",ret);
	}
	return 0;
}

你可能感兴趣的:(poj 1273 Drainage Ditches--网络流)