链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532。
纯粹最大流,注意有重边,用Dinic。
#include<iostream> #include<cstring> #include<queue> #define maxn 400 #define INF (1<<31)-1 using namespace std; struct Edge { int from,to,cap,flow; Edge(int u,int v,int c,int f): from(u),to(v),cap(c),flow(f) {} }; struct Dinic { int n,m,s,t; vector<Edge> edges; vector<int> G[maxn]; bool vis[maxn]; int d[maxn]; int cur[maxn]; void init(int n) { for (int i=0; i<n; i++) G[i].clear(); edges.clear(); } void Addedge(int from,int to,int cap) { edges.push_back(Edge(from,to,cap,0)); edges.push_back(Edge(to,from,0,0)); m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool bfs() { memset(vis,false,sizeof(vis)); queue<int> Q; Q.push(s); d[s] = 0; vis[s] = true; while (!Q.empty()) { int x = Q.front(); Q.pop(); for (int i=0; i<G[x].size(); i++) { Edge& e = edges[G[x][i]]; if (!vis[e.to] && e.cap>e.flow) { vis[e.to] = true; d[e.to] = d[x]+1; Q.push(e.to); } } } return vis[t]; } int dfs(int x,int a) { if (x == t || a == 0) return a; int flow = 0, f; for (int i=cur[x]; i<G[x].size(); i++) { Edge& e = edges[G[x][i]]; if (d[e.to] == d[x]+1 && (f = dfs(e.to,min(a,e.cap-e.flow))) > 0) { e.flow += f; edges[G[x][i]^1].flow -= f; flow += f; a -= f; if (a == 0) break; } } return flow; } int Maxflow(int s,int t) { int flow = 0; while (bfs()) { memset(cur,0,sizeof(cur)); flow += dfs(s,INF); } return flow; } }; int main() { Dinic a; int m; while (cin>>m>>a.n) { a.init(a.n); for (int i=0; i<m; i++) { int from,to,cap; cin>>from>>to>>cap; a.Addedge(from,to,cap); } a.s = 1; a.t = a.n; cout<<a.Maxflow(a.s,a.t)<<endl; } return 0; }