啊,第一滴血,网络流
#include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; struct point { int c; int f; }a[18][18]; vector<point> v[20]; queue<int> q; int n,m; int vis[25]; int maxflow; int pre[25]; int augment; void find_path() { int t; augment=inf; memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); int i,j; vis[1]=1; q.push(1); while(q.size()) { t=q.front(); q.pop(); for(i=1;i<=n;i++) { if(vis[i]==0&&a[t][i].c) { augment=min(augment,a[t][i].c); pre[i]=t; q.push(i); vis[i]=1; } } } return ; } void update_maxflow() { int s=n; maxflow+=augment; while(pre[s]) { a[pre[s]][s].c-=augment; a[s][pre[s]].c+=augment; s=pre[s]; } return ; } void solve() { maxflow = 0; int i,j; while(1) { find_path(); if(augment==inf||pre[n]==0) //没写pre[n]==0,tle了几发,而且不加是错的 { break; } update_maxflow(); } return ; } int main() { std::ios::sync_with_stdio(false); int t; cin>>t; for(int kase=1;kase<=t;kase++) { memset(a,0,sizeof(a)); cin>>n>>m; int i,j; int x,y,z; for(i=0;i<m;i++) { cin>>x>>y>>z; a[x][y].c+=z; } solve(); cout<<"Case "<<kase<<": "; cout<<maxflow<<endl; } }