最明显的最大流了. //SAP+GAP #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN=200,INF=100000000; int c[MAXN+1][MAXN+1]; int h[MAXN+1],vh[MAXN+1]; int n,augc,m; int flow=0; bool found; void aug(const int p) { int i,augco,minh; minh=n-1; augco=augc; if(h[1]>=n) return; if(p==n) { found=true; flow+=augc; return; } for(i=1;i<=n;i++) { if(i==p) continue; if(c[p][i]>0) { if(h[i]+1==h[p])//SAP { if(c[p][i]<augc) augc=c[p][i]; aug(i); if(h[1]>=n) return; if(found) break; augc=augco; } if(h[i]<minh) minh=h[i]; } } if(!found) { vh[h[p]]--; if(vh[h[p]]==0) { h[1]=n;//GAP return; } h[p]=minh+1; vh[h[p]]++; } else { c[p][i]-=augc; c[i][p]+=augc; } return; } int main() { int i,j,k; while(scanf("%d%d",&m,&n)!=EOF) { flow=0; memset(c,0,sizeof(c)); for(i=1;i<=m;i++) { scanf("%d%d%d",&j,&k,&augc); c[j][k]+=augc; } memset(h,0,sizeof(h)); memset(vh,0,sizeof(vh)); vh[0]=n; while(h[1]<n) { augc=INF; found=false; aug(1); } printf("%d/n",flow); } return 0; }