依旧是最大流板子
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> using namespace std; struct note { int fr,to,c,f; note(int a,int b,int x,int y):fr(a),to(b),c(x),f(y) {} }; const int maxn=1000+100; const int maxm=30; const int inf=0x3f3f3f3f; struct Karp { vector<note> aa; vector<int> g[maxm]; int a[maxm],p[maxm]; void init(int n) { for(int i=0;i<n;i++) g[i].clear(); aa.clear(); } void addadge(int x,int y,int z) { aa.push_back(note(x,y,z,0)); aa.push_back(note(y,x,0,0)); int mm=aa.size(); g[x].push_back(mm-2); g[y].push_back(mm-1); } int maxflow(int s,int t) { int flow=0; while(1) { memset(a,0,sizeof(a)); a[s]=inf; queue<int> q; q.push(s); while(q.size()) { int x=q.front();q.pop(); for(int i=0;i<g[x].size();i++) { note &e=aa[g[x][i]]; if(!a[e.to]&&(e.c>e.f)) { a[e.to]=min(a[x],e.c-e.f); p[e.to]=g[x][i]; q.push(e.to); } } if(a[t]) break; } if(!a[t]) break; for(int i=t;i!=s;i=aa[p[i]].fr) { aa[p[i]].f+=a[t]; aa[p[i]^1].f-=a[t]; } flow+=a[t]; } return flow; } }; Karp mmp; int m,n,t; int main() { scanf("%d",&t); for(int zz=1;zz<=t;zz++) { scanf("%d%d",&n,&m); mmp.init(n); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); mmp.addadge(x,y,z); } printf("Case %d: %d\n",zz,mmp.maxflow(1,n)); } return 0; }
时间: 2024-12-06 05:16:26