题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3549
【科普】什么是BestCoder?如何参加? |
Flow ProblemTime Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 8862 Accepted Submission(s): 4168 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 Author HyperHexagon |
初学网络流,首先得对 流网络的一些概念有些认识(增广路径,残留网,割),沿着增广路径可以向其中压入一些流来达到增大流;
可以从 http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 学习网络流基础
/* 网络流入门题,EK算法找最大流 */ #include <iostream> #include <stdio.h> #include <string> #include <string.h> #include <algorithm> #include <queue> const int N=100; using namespace std; int pre[N]; // pre[i]表示顶点i的前驱顶点 int vis[N]; int map[N][N]; //残留网络中每条边的容量 int s,t; int n,m; bool bfs() { memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); queue<int>que; vis[s]=1,que.push(s); while(!que.empty()) { int cur=que.front(); que.pop(); if(cur==t)return true; for(int i=1;i<=n;i++) { if( !vis[i] && map[cur][i]) { vis[i]=1; que.push(i); pre[i]=cur; } } } return false; } int Max_Flow() { int ans=0; while( true ) { if(!bfs())return ans; int Min=99999999; for(int i=t;i!=s;i=pre[i]) Min=min(Min,map[pre[i]][i]); //找到这条增广路径中容量最小的一个值 for(int i=t;i!=s;i=pre[i]) { map[pre[i]][i]-=Min; map[i][pre[i]]+=Min; } ans+=Min; } return ans; } int main() { int T,test=1; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); s=1,t=n; memset(map,0,sizeof(map)); while(m--) { int u,v,c; scanf("%d%d%d",&u,&v,&c); map[u][v]+=c; } printf("Case %d: %d\n",test++,Max_Flow()); } return 0; }