链接: http://poj.org/problem?id=1273
最大流问题.
#include <iostream> #include <vector> #include <cstring> #define MAX_M 200 #define INF 100000000 using namespace std; typedef struct { int to; int cap; //容量 int rev; //反向边 }edge; vector<edge> G[MAX_M+5]; bool used[MAX_M+5]; 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(e.cap,f)); if(d>0) { e.cap-=d; G[e.to][e.rev].cap+=d; return d; } } } return 0; } long long max_flow(int s,int t) { long long flow =0; while(true) { memset(used,0,sizeof(used)); int f=dfs(s,t,INF); if(f==0) return flow; flow+=f; } } void init(void) { memset(used,0,sizeof(used)); for(int i=0;i<MAX_M+5;i++) G[i].clear(); } int main() { int N,M; int s,e,c; while(cin>>N>>M) { init(); for(int i=0;i<N;i++) { cin>>s>>e>>c; add_edge(s,e,c); } cout<<max_flow(1,M)<<endl; } return 0; }
天下武功,唯快不破