最大网络流算法
2021-06-28 14:05
阅读:487
标签:lse http ons .com 数组 条件 pre std bsp
最大网络流,需要的准备是:BFS,EK算法
用pre数组记录前驱节点,用vis判断是否访问过
用g二维数组表示残余网络,用f二维数组表示实际流网络
下面这篇博客详细介绍了最大网络流:既然已经有了轮子,那我就不造了
https://www.cnblogs.com/zsboy/archive/2013/01/27/2878810.html
下面是我的代码
#include#include #include #include using namespace std; const int maxn=100; const int INF=9999999; int g[maxn][maxn];//残余网络,初始值为最大流量 int f[maxn][maxn];//实流网络,初始值都是零 int pre[maxn];//存储前驱节点 bool vis[maxn];//判断是否访问过 int n,m; bool bfs(int s,int t) { memset(pre,-1,sizeof(pre)); memset(vis,false,sizeof(vis)); vis[s]=true; queueint> que; que.push(s); while(!que.empty()) { int now=que.front(); que.pop(); for(int i=1;i) { if(!vis[i]&&g[now][i]>0)//g[now][i]>0这个条件保证了bfs不会重复搜索 { vis[i]=true; pre[i]=now; if(i==t) return true; que.push(i); } } } return false; } int EK(int s,int t) { int v,w,d,maxflow; maxflow=0; while(bfs(s,t)) { d=INF; v=t; while(v!=s) { w=pre[v]; if(d>g[w][v]) d=g[w][v]; v=w; } maxflow+=d; v=t; while(v!=s) { w=pre[v]; g[w][v]-=d; g[v][w]+=d; if(f[v][w]>0) f[v][w]-=d; else f[w][w]+=d; v=w; } } return maxflow; } int main() { int u,v,w; cin>>n>>m; memset(g,0,sizeof(g)); memset(f,0,sizeof(f)); for(int i=1;i) { cin>>u>>v>>w; g[u][v]+=w; } cout1,n)endl; return 0; }
最大网络流算法
标签:lse http ons .com 数组 条件 pre std bsp
原文地址:https://www.cnblogs.com/acmblog/p/9648998.html
上一篇:个人项目:WC(Java 实现)
下一篇:java实现wc
评论
亲,登录后才可以留言!