博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
板子 网络流算法
阅读量:5153 次
发布时间:2019-06-13

本文共 2797 字,大约阅读时间需要 9 分钟。

1 .Edmonds-Karp   算法 : 通过反向增光路+bfs 求解最大流

#include
using namespace std;#define LOACL freopen("in","r",stdin);\ freopen("out","w",stdout);#define FASTIO ios::sync_with_stdio(false);#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";#define add(u,v,w) e[++tot]=(edge){v,head[u],1},head[u]=tot;#define CLR(arr,val) memset(arr,val,sizeof(arr))#define DBG(x) cout<<(#x)<<"="<
<
View Code

 2Dinic  算法  BFS 分层 DFS 找最大流

#include
using namespace std;#define LOACL freopen("in","r",stdin);\ freopen("out","w",stdout); #define FASTIO ios::sync_with_stdio(false);#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";const int inf = 987654321;const int sz = (int)100010;const int mod = (int)1e9 + 7;const int sqrtn = 300; #define add(u,v,w) e[++tot]=(edge){v,head[u],w},head[u]=tot; #define CLR(arr,val) memset(arr,val,sizeof(arr)) #define DBG(x) cout<<(#x)<<"="<
<
View Code

 费用流 EK算法 spfa 找增广路 + 尾部合并

#include
using namespace std;#define LOACL freopen("in","r",stdin);\ freopen("out","w",stdout);const int sz = 50010;const int inf = 0x3f3f3f3f;#define CLR(arr,val) memset(arr,val,sizeof(arr))#define REP(i, a, b) for(int i=(a); i<=(b); i++)#define Loop(i,u) for(int i = head[u];i!=-1;i=e[i].nxt)int n, m, s, t, u, v, w, f;struct edge{ int v, nxt, w, f;} e[sz << 1];int tot = -1, head[sz], pre[sz], inq[sz], dist[sz], incf[sz], maxflow, ans;void add(int u, int v, int w, int f){ e[++tot] = (edge) {v, head[u], w, f}, head[u] = tot;} bool spfa(int s, int t){ fill(dist, dist + n + 1, INT_MAX); CLR(inq, 0); queue
q ; q.push(s); inq[s] = 1; dist[s] = 0; incf[s] = inf; while(!q.empty()) { int v = q.front();q.pop(); inq[v]=0; Loop(i,v) { if(e[i].w>0 && dist[e[i].v]>dist[v]+e[i].f) { dist[e[i].v]=dist[v]+e[i].f; incf[e[i].v]=min(e[i].w,incf[v]); pre[e[i].v]=i; if(!inq[e[i].v]) { q.push(e[i].v); inq[e[i].v]=1; } } } } return dist[t]!=INT_MAX;}void update(int s, int t){ int x = t; while (x != s) { int i = pre[x]; e[i].w -= incf[t]; e[i ^ 1].w += incf[t]; x = e[i ^ 1].v; } maxflow += incf[t]; ans += dist[t] * incf[t];}void EK(int s, int t){ while (spfa(s, t)) update(s, t);} int main(){ LOACL CLR(head,-1); cin >> n >> m >> s >> t; REP(i, 1, m) { cin >> u >> v >> w >> f; add(u, v, w, f); add(v, u, 0, -f); } EK(s, t); cout << maxflow << " " << ans << endl;}
View Code

 

转载于:https://www.cnblogs.com/corx/p/9055520.html

你可能感兴趣的文章
js兼容公用方法
查看>>
如何将应用完美迁移至Android P版本
查看>>
【转】清空mysql一个库中的所有表的数据
查看>>
基于wxPython的python代码统计工具
查看>>
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>