void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

网络流的简单应用,求源点到终点的最大网络流

用EK算法

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <queue>
#include <limits.h>
#define MAX 250
using namespace std;
int cap[MAX][MAX];
int m;
int EKarp(int s,int t)
{
	queue<int> Q;
	int flow[MAX][MAX],a[MAX],u,v,f,pre[MAX];
	f = 0;
	memset(flow,0,sizeof(flow));
	while(1)
	{
		Q.push(s);
		memset(a,0,sizeof(a));
		a[s]=INT_MAX;
		while(!Q.empty())
	   {
	       u=Q.front();
		   Q.pop();
	       for(v=1;v<=m;v++)
	       if(!a[v]&&cap[u][v]>flow[u][v])
	       {
	           a[v]=min(a[u],cap[u][v]-flow[u][v]);
               Q.push(v);
               pre[v]=u;
           }
      
      
      }
      if(a[t]==0)
      break;
      for(u=t;u!=s;u=pre[u])
      {
          flow[pre[u]][u]+=a[t];
          flow[u][pre[u]]-=a[t];
      }
      f+=a[t];
	}
	return f;
}
int main()
{
	int from,to,c,n,ans;
	while( scanf("%d%d",&n,&m) != EOF )
	{
		memset(cap,0,sizeof(cap));
		while( n-- )
		{
			scanf("%d%d%d",&from,&to,&c);
			cap[from][to] += c;
		}
		ans = EKarp(1,m);
		printf("%d\n",ans);
	}
return 0;
}
posted on 2011-05-16 13:06  void-man  阅读(174)  评论(0)    收藏  举报