poj 1273 最大流

终于尝试了网络流,看了两天的网络流,稍微有点头绪,做了第一道网络流的题感觉还不错。在这过程中让我最苦恼的还是用邻接表的存储结构,现在还是初步了解就不做总结吧。

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
#define MAX_INT 1234567890
struct node
{
	int v;
	int value;
	int opposite;
	int next;
};
node edge[2001];
int head[201],pre[201],flow[201],st[201],N;
queue <int> Q;
int bfs(int s,int t)
{
	int e,j;
	memset(flow,0,sizeof(flow));
	memset(pre,0,sizeof(pre));
	while(!Q.empty()) Q.pop();
	flow[s]=MAX_INT;
	Q.push(s);
	while(!Q.empty())
	{
		e=Q.front(),Q.pop();
		if(e==t) break;
		for(j=head[e];j;j=edge[j].next)
		{
			if(!pre[edge[j].v] && edge[j].value>0)
			{
				flow[edge[j].v]=(flow[e]<edge[j].value)? flow[e] : edge[j].value;
				pre[edge[j].v]=j;  st[edge[j].v]=e;
				Q.push(edge[j].v);
			}
		}
	}
	return flow[t];
}
int Ford_Fulkerson(int s,int t)
{
	int j,k,w,max_flow=0;
	while(w=bfs(s,t))
	{
		max_flow+=w;
		for(k=t;k!=1;k=st[k])
		{
			edge[pre[k]].value-=w;
            j=edge[pre[k]].opposite;
			edge[j].value+=w;
		}
	}
	return max_flow;
}
int add(int s,int t,int w)
{
	edge[N].v=t; edge[N].value=w;
	edge[N].next=head[s];
	return N++;
}
int main()
{
	int i,m,n,s,t,w;
	while(cin>>m>>n)
	{
		memset(head,0,sizeof(head));
		for(N=1,i=0;i<m;i++)
		{
			cin>>s>>t>>w;
			head[s]=add(s,t,w);
			head[t]=add(t,s,0);
			edge[head[s]].opposite=head[t];
			edge[head[t]].opposite=head[s];
		}
		cout<<Ford_Fulkerson(1,n)<<endl;
	}
	return 0;
}
posted @ 2011-08-21 13:20  书山有路,学海无涯  阅读(253)  评论(0编辑  收藏  举报