赤裸裸的网络流。
暴力增广路算法就能过。
/* ID: modengd1 PROG: ditch LANG: C++ */ #include <iostream> #include <stdio.h> #include <vector> #include <memory.h> using namespace std; #define INF 0x7fffffff int E[201][201]; bool used[201]; /* 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=1;i<201;i++) { if(!used[i]&&E[v][i]>0) { int d=DFS(i,t,min(f,E[v][i])); if(d>0) { E[v][i]-=d; E[i][v]+=d; return d; } } } return 0;//没有这句可能超时 } int max_flow(int s,int t) { int flow = 0; while(true) { memset(used,false,sizeof(used)); int f=DFS(s,t,INF); if(f == 0) return flow; flow+=f; } } int main() { int N,M,a,b,c; freopen("ditch.in","r",stdin); freopen("ditch.out","w",stdout); memset(E,0,sizeof(E)); cin>>N>>M; for(int i=0;i<N;i++) { cin>>a>>b>>c; E[a][b]+=c; } cout<<max_flow(1,M)<<endl; return 0; }
原文:http://www.cnblogs.com/modengdubai/p/4849003.html