2 3 2 1 2 1 2 3 1 3 3 1 2 1 2 3 1 1 3 1
Case 1: 1 Case 2: 2第一次接触最大流,水题练手,使用了EK的方法,这个题不需要考虑建图,直接使用模板#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define maxn 2100 #define INF 0x3f3f3f3f struct edge{ int v , w ; int next ; } p[maxn]; int head[maxn] , cnt , vis[maxn] , pre[maxn]; queue <int> q ; void add(int u,int v,int w) { p[cnt].v = v ; p[cnt].w = w ; p[cnt].next = head[u] ; head[u] = cnt++ ; p[cnt].v = u ; p[cnt].w = 0 ; p[cnt].next = head[v] ; head[v] = cnt++ ; } int bfs(int s,int t) { int u , v , i , min1 = INF ; while( !q.empty() ) q.pop() ; memset(vis,0,sizeof(vis)); vis[s] = 1 ; q.push(s) ; while(!q.empty()) { u = q.front() ; q.pop(); for(i = head[u] ; i != -1 ; i = p[i].next ) { v = p[i].v ; if( !vis[v] && p[i].w ) { vis[v] = 1 ; min1 = min(min1,p[i].w); pre[v] = i ; q.push(v) ; } } } if(vis[t]) return min1 ; return -1 ; } int main() { int tt , t , n , m , i , u , v , w , max_flow; scanf("%d", &t); for(tt = 1 ; tt <= t ; tt++) { cnt = 0 ; max_flow = 0 ; memset(head,-1,sizeof(head)); scanf("%d %d", &n, &m); while(m--) { scanf("%d %d %d", &u, &v, &w); add(u,v,w); } memset(pre,-1,sizeof(pre)); while(1) { int k = bfs(1,n); if(k == -1) break; max_flow += k ; for(i = pre[n] ; i != -1 ; i = pre[ p[ i^1 ].v ] ) { p[i].w -= k ; p[i^1].w += k ; } } printf("Case %d: %d\n", tt, max_flow); } return 0; }
hdu3549--Flow Problem(初识最大流),布布扣,bubuko.com
原文:http://blog.csdn.net/winddreams/article/details/38664987