网络流模板
Dinic:
#include<bits/stdc++.h> using namespace std; const int maxn=210; const int inf=0xfffffff; struct Edge{int from,to,cap,flow;}; int n,m,s,t; //结点数,边数(包括反向弧),源点,汇点 vector<Edge> edges; //edges[e]与edges[e^1]互为反向弧 vector<int> G[maxn]; bool vis[maxn]; int d[maxn]; //从起点到i的距离 int cur[maxn]; //当前弧下标 void addedge(int from,int to,int cap){ edges.push_back((Edge){from,to,cap,0}); edges.push_back((Edge){to,from,0,0}); int k=edges.size(); G[from].push_back(k-2); G[to].push_back(k-1); } bool BFS(){ memset(vis,0,sizeof(vis)); queue<int> Q; Q.push(s); d[s]=0; vis[s]=1; while (!Q.empty()){ int x=Q.front(); Q.pop(); for (int i=0;i<G[x].size();i++){ Edge & e=edges[G[x][i]]; if (!vis[e.to] && e.cap>e.flow){ vis[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[t]; } int DFS(int x,int a){ if (x==t || a==0) return a; int flow=0,f; for (int& i=cur[x];i<G[x].size();i++){ Edge& e=edges[G[x][i]]; if (d[x]+1==d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if (a==0) break; } } return flow; } int max_flow(){ int flow=0; while (BFS()){ memset(cur,0,sizeof(cur)); flow+=DFS(s,inf); } return flow; } int main(){ int x,y,z; while (cin >> m >> n){ edges.clear(); for (int i=1;i<=n;i++) G[i].clear(); for (int i=0;i<m;i++){ cin >> x >> y >> z; addedge(x,y,z); } s=1;t=n; int ans=max_flow(); cout << ans << endl; } return 0; }