hduoj 1532
Ford-Fulkerson方法入门。
有多个输入,因为这个WA了好多次。
#include <iostream> #include <algorithm> #include <vector> #include <cstring> using namespace std; const int MAX_N_M = 205; const int INF = 10000005; struct edge { int to; int cap; int rev; }; int n, m; vector<edge> G[MAX_N_M]; bool used[MAX_N_M]; void add_edge(int from, int to, int cap) { //重边不影响 G[from].push_back((edge){to, cap, G[to].size()}); G[to].push_back((edge){from, 0, G[from].size()-1}); } int dfs(int v, int t, int f) { if(v == t) return f; used[v] = true; for(int i=0; i<G[v].size(); i++) { edge &e = G[v][i]; if(!used[e.to] && e.cap>0) { int d = dfs(e.to, t, min(f, e.cap)); if(d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } int max_flow(int s, int t) { int flow = 0; while(true) { memset(used, 0, sizeof(used)); int f = dfs(s, t, INF); if(f == 0) return flow; flow += f; } } int main() { while(~scanf("%d%d", &n, &m)) { memset(G, 0, sizeof(G)); //G需要初始化 for(int i=0; i<n; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); add_edge(a, b, c); } printf("%d\n", max_flow(1, m)); } return 0; }