杭电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; }
相关文章推荐
- 【最大流+模板题】杭电 hdu 3549 Flow Problem
- 文章标题 HDU 3549 : Flow Problem (最大流--模板)
- HDU--杭电--3549--Flow Problem--最大流
- hdu 3549 Flow Problem【最大流增广路入门模板题】
- hdu 3549 Flow Problem(最大流EK算法模板)
- hdu 3549 Flow Problem【最大流增广路入门模板题】
- HDU 3549 Flow Problem【E-K+BFS 最大流】
- 杭电1532 Drainage Ditches(前向星最大流)
- hdu 3549 Flow Problem(最大流模板题)
- hdu 3549 Flow Problem【Dinic最大流】
- hdoj--3549--Flow Problem(最大流)
- [ACM] hdu 3549 Flow Problem (最大流模板题)
- HDU 3549 Flow Problem 最大流模板题
- hdu 3549 最大网络流 Flow Problem
- hdu 3549 Flow Problem【最大流】
- hdu 3549 Flow Problem(最大流模板题)
- hdu 3549 Flow Problem (ek算法模板)
- hdu 3549 Flow Problem (EK 最大流)
- HDU 3549 Flow Problem(最大流裸题,EK解法)
- HDU 3549--Flow Problem【最大流】