hdu 1532(最大流)
网络流最大流问题,开始学最大流了.....Edmonds-Karp板子
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; const int maxn=200+10; const int inf=0x3f3f3f3f; struct note { int fr,to,c,f; note(int a,int b,int e,int d):fr(a),to(b),c(e),f(d) {} }; struct Karp { vector<note> aa; vector<int> g[maxn]; int a[maxn],p[maxn]; 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)); queue<int> q; q.push(s); a[s]=inf; while(q.size()) { int x=q.front(); q.pop(); for(int i=0; i<g[x].size(); i++) { int tt=g[x][i]; if(!a[aa[tt].to]&&(aa[tt].c>aa[tt].f)) { a[aa[tt].to]=min(a[x],aa[tt].c-aa[tt].f); p[aa[tt].to]=g[x][i]; q.push(aa[tt].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 n,m; int main() { while(~scanf("%d%d",&n,&m)) { mmp.init(n); for(int i=0;i<n;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); mmp.addadge(x,y,z); } printf("%d\n",mmp.maxflow(1,m)); } return 0; }
浙公网安备 33010602011771号