标签:方法 logs sizeof 不同 ++ round flow img ems
●2017.3.31
●学习内容:网络流之求解最大流算法
引:最大流问题(maximum flow problem),一种组合最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果。
●算法(e,我学了的……)
int dfs(int x,int low) { if(x==m) return low; if(vis[x]) return 0; vis[x]=1; for(int flow,i=1;i<=m;i++) { if(tub[x][i]&&(flow=dfs(i,min(low,tub[x][i])))) { tub[x][i]-=flow; tub[i][x]+=flow; return flow; } } return 0; } int maxflow(int s,int t) { int ans=0,flow; while(flow=dfs(1,INF)){memset(vis,0,sizeof(vis));;ans+=flow;} return ans; }
int dfs(int x,int low) { if(x==m) return low; if(vis[x]) return 0; vis[x]=1; for(int flow,i=cur[x];i<=m;i++)//枚举时从cur[x]或cur[x]+1开始似乎都可以,因为疯狂的while()会直到没有增广路才停下来; { if(tub[x][i]&&(flow=dfs(i,min(low,tub[x][i])))) { cur[x]=i; tub[x][i]-=flow; tub[i][x]+=flow; return flow; } } return 0; } int maxflow(int s,int t) { int ans=0,flow; while(flow=dfs(1,INF)) {memset(vis,0,sizeof(vis));memset(cur,0,sizeof(cur));ans+=flow;} return ans; }
bool bfs() { memset(vis,0,sizeof(vis)); queue<int>q; q.push(1); d[1]=1; vis[1]=1; while(!q.empty()) { int u=q.front();q.pop(); for(int i=head[u];~i;i=e[i].next)if(e[i].capo) { int v=e[i].to; if(vis[v]) continue; d[v]=d[u]+1; vis[v]=1; q.push(v); } } return vis[m]; } int dfs(int u,int res) { if(u==m||!res) return res; int flowout=0,v,f; for(int &i=cur[u];~i;i=e[i].next) { v=e[i].to; if(d[v]!=d[u]+1) continue; f=dfs(v,min(e[i].capo,res)); e[i].capo-=f; e[i^1].capo+=f; flowout+=f; res-=f; if(!res) break; } return flowout; } int maxflow() { while(bfs()) { for(int i=1;i<=m;i++) cur[i]=head[i]; ans+=dfs(1,INF); } }
标签:方法 logs sizeof 不同 ++ round flow img ems
原文地址:http://www.cnblogs.com/zj75211/p/6653537.html