poj 1273

网络流最基础的题目,最大流

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=210;
const int inf=1<<30;
int cap[maxn][maxn],flow[maxn][maxn],d[maxn];
int n,m,tot;
void ek()
{
	int q[maxn],p[maxn],i;
	int front,rear;
	for(;;)
	{
		memset(d,0,sizeof(d));
		front=rear=0;
		q[rear++]=1;
		d[1]=inf;
		while(rear-front>0)
		{
			int u=q[front];
			for(i=1;i<=m;i++)
			{
				if(!d[i]&&cap[u][i]>flow[u][i])
				{
					p[i]=u;
					q[rear++]=i;
					d[i]=d[u]>(cap[u][i]-flow[u][i])?(cap[u][i]-flow[u][i]):d[u]
						;
				}
			}
			front++;
		}
		if(!d[m]) break;
		int tem;
		for(tem=m;tem!=1;tem=p[tem])
		{
			flow[p[tem]][tem]+=d[m];
			flow[tem][p[tem]]-=d[m];
		}
		tot+=d[m];
	}
	return;
}
int main()
{
	while(cin>>n>>m)
	{
		int i,u,v,f;
		tot=0;
		memset(cap,0,sizeof(cap));
		memset(flow,0,sizeof(flow));
		for(i=0;i<n;i++)
		{
			cin>>u>>v>>f;
			cap[u][v]+=f;
		}
		ek();
		cout<<tot<<endl;
	}
	return 0;
}


posted @ 2012-11-27 15:25  LJ_COME!!!!!  阅读(98)  评论(0编辑  收藏  举报