您的位置:首页 > 其它

杭电3549 Flow Problem(最大流Dinic+前向星模板)

2014-09-26 11:52 316 查看

Flow Problem

Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 8276 Accepted Submission(s): 3849



Problem Description
Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph.


Input
The first line of input contains an integer T, denoting the number of test cases.

For each test case, the first line contains two integers N and M, denoting the number of vertexes and edges in the graph. (2 <= N <= 15, 0 <= M <= 1000)

Next M lines, each line contains three integers X, Y and C, there is an edge from X to Y and the capacity of it is C. (1 <= X, Y <= N, 1 <= C <= 1000)


Output
For each test cases, you should output the maximum flow from source 1 to sink N.


Sample Input
2
3 2
1 2 1
2 3 1
3 3
1 2 1
2 3 1
1 3 1




Sample Output
Case 1: 1
Case 2: 2
/*
好几天没敲代码了。。。。最大流模板
加油!!!
Time:2014-9-26 11:54
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<climits>
using namespace std;
#define MAX 1010
#define INF INT_MAX
struct Edge{
	int u,v,cap;
	int next;
	Edge(){}
	Edge(int u,int v,int cap,int next):u(u),v(v),cap(cap),next(next){}
}edge[MAX<<2];
int d[MAX],head[MAX];
int N,M,Num; 
void Init(){
	Num=0;
	memset(head,-1,sizeof(head));
}
void Add(int u,int v,int cap){
	edge[Num]=Edge(u,v,cap,head[u]);
	head[u]=Num++;
	edge[Num]=Edge(v,u,0,head[v]);
	head[v]=Num++;
}
bool BFS(int S,int T){
	memset(d,-1,sizeof(d));//层次
	queue<int>q;
	q.push(S);d[S]=0;//一定要记得 
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=head[u];i!=-1;i=edge[i].next){
			int v=edge[i].v;
			if(d[v]==-1&&edge[i].cap>0){
				d[v]=d[u]+1;
				q.push(v);
			}
		} 
	}
	return d[T]!=-1;
}
int DFS(int u,int cur_flow){
	if(u==N) return cur_flow;
	int temp=cur_flow;
	for(int i=head[u];i!=-1;i=edge[i].next){
		int v=edge[i].v;
		if(edge[i].cap>0&&d[u]+1==d[v]){
			int flow=DFS(v,min(temp,edge[i].cap));
			edge[i].cap-=flow;
			edge[i^1].cap+=flow;
			temp-=flow;//把相连接的几条都减掉 
		}
	}
	return cur_flow-temp;
}
int Dinic(int S,int T){
	int flow=0;
	while(BFS(S,T)){
		int t;
		while(t=DFS(S,INF))
			flow+=t;
	}
	return flow;
}
void solve(){
	int nCase,Case=0;
	scanf("%d",&nCase);
	while(nCase--){
		Init();
		scanf("%d%d",&N,&M);
		int u,v,c;
		while(M--){
			scanf("%d%d%d",&u,&v,&c);
			Add(u,v,c);
		}
		int S=1;int T=N;
		printf("Case %d: %d\n",++Case,Dinic(S,T));
	}
}
int main(){
	solve();
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: