这个好像跟EK算法的本质差不多,不过一个dfs,一个bfs,总体看来一般用bfs会好一点。
程序:
#include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; struct edge{ int from,to,cap,flow,nod; }; vector<edge>g[20000]; int s,t; bool vis[20000]; void add(int u,int v,int w) { g[u].push_back((edge){u,v,w,0,g[v].size()}); g[v].push_back((edge){v,u,0,0,g[u].size()-1}); } int dfs(int now,int maxx) { if (now==t) return maxx; vis[now]=true; for (int i=0;i<g[now].size();i++) { edge e=g[now][i]; if ((!vis[e.to])&&(e.cap>e.flow)) { int d=dfs(e.to,min(maxx,e.cap-e.flow)); if (d>0) { e.flow+=d; g[now][i]=e; g[e.to][e.nod].flow-=d; return d; } } } return 0; } int main() { int m,a,b,c,n; scanf("%d%d%d%d",&n,&m,&s,&t); for (int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } int ans=0; for (;;) { memset(vis,0,sizeof vis); int sum=dfs(s,210000000); if (sum==0) break; ans+=sum; } printf("%d\n",ans); return 0; }
时间: 2024-12-28 21:56:28