HDU3549(Ford-Fulkerson算法最大流)

解题思路:这是一道最大流模板题。虽然知道dinic算法更适合一些,但还是用来练练Ford-Fulkerson算法。复杂度为O(F|E|)),不知道怎么算的。。。我觉得该算法相较于dinic算法的优点就是代码量小,写的快。对时间要求不高时,可以用!!

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int cnt,ca;
struct node
{
	int v,w,next;
}s[2006];
int n,m;
int head[16];
int used[16];
const int inf=0x3f3f3f3f;
int dfs(int v,int t,int f)
{
	if(v==t) return f;
	used[v]=1;
	for(int i=head[v];i!=-1;i=s[i].next)
	{
		int p=s[i].v;
		int c=s[i].w;
		if(!used[p]&&c>0)
		{
			int d=dfs(p,t,min(f,c));
			if(d>0)
			{
				s[i].w-=d;
				s[i^1].w+=d;
				return d;
			}
		}
	}
	return 0;
}
void max_flow()
{
	int flow=0;
	while(1)
	{
		memset(used,0,sizeof(used));
		int f=dfs(1,n,inf);
		if(f==0) break;
		flow+=f;
	}
	printf("Case %d: %d\n",++ca,flow);
}
void add_edge(int x,int y,int c)
{
	s[cnt].v=y;
	s[cnt].w=c;
	s[cnt].next=head[x];
	head[x]=cnt++;
	
	s[cnt].v=x;
	s[cnt].w=0;
	s[cnt].next=head[y];
	head[y]=cnt++;	
}
int main()
{
	int T,x,y,c;
	//freopen("t.txt","r",stdin);
	scanf("%d",&T);
	ca=0;
	while(T--)
	{
		scanf("%d%d",&n,&m);
		memset(head,-1,sizeof(head));
		cnt=0;
		for(int i=0;i<m;i++)
		{
			scanf("%d%d%d",&x,&y,&c);
			add_edge(x,y,c);
		}
		max_flow();
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_39861441/article/details/87558635