图论模板——最大流问题

Dinic算法的时间复杂度为O(n^2m)。实际运用远远小于这个上界。
特别的,Dinic算法求解二分图最大匹配的时间复杂度为O(m
sqrt(n))
最大流问题模板

#include <bits/stdc++.h>
using namespace std;
const int N = 10010,M = 200010, INF = 1e8;
int n,m,S,T;
int h[N],ne[M],e[M],f[M],idx;
int d[N],q[N],cur[N];
void add(int a,int b,int c)
{e[idx] = b,f[idx] = c,ne[idx] = h[a],h[a] = idx++;e[idx] = a,f[idx] = 0,ne[idx] = h[b],h[b] = idx++;
}
bool bfs()
{int hh = 0, tt = 0;memset(d, -1, sizeof d);q[0] = S, d[S] = 0, cur[S] = h[S];while (hh <= tt){int t = q[hh ++ ];for (int i = h[t]; ~i; i = ne[i]){int ver = e[i];if (d[ver] == -1 && f[i]){d[ver] = d[t] + 1;cur[ver] = h[ver];if (ver == T)  return true;q[ ++ tt] = ver;}}}return false;
}
int find(int u,int limit)
{if (u==T) return limit;int flow = 0;for (int i = cur[u];~i&&flow<limit;i = ne[i]){cur[u] = i;//当前弧优化int ver = e[i];if (d[ver] == d[u]+1&&f[i]){int t = find(ver,min(f[i],limit-flow));if (!t) d[ver] = -1;f[i] -= t,f[i^1] += t,flow+=t;}}return flow;
}
int dinic()
{int r = 0,flow;while (bfs()) while (flow = find(S,INF)) r += flow;return r;
}
int main()
{scanf("%d%d%d%d",&n,&m,&S,&T);memset(h,-1,sizeof h);while (m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c);}printf("%d\n",dinic());return 0;
}

应用一:二分图匹配问题
飞行员配对方案问题 https://www.acwing.com/problem/content/2177/

int main()
{scanf("%d%d",&m,&n);S = 0,T = n+1;memset(h,-1,sizeof h);for (int i = 1;i<=m;i++) add(S,i,1);for (int i = m+1;i<=n;i++) add(i,T,1);int a,b;while (scanf("%d%d",&a,&b),a!=-1) add(a,b,1);printf("%d\n",dinic());for (int i=0;i<idx;i+=2)if (e[i]>m&&e[i]<=n&&!f[i]) printf("%d %d\n",e[i^1],e[i]);return 0;
}

应用二:无源汇的最大流问题
无源汇上下界可行流 https://www.acwing.com/problem/content/2190/)
注意流量守恒

int main()
{memset(h,-1,sizeof h);scanf("%d%d",&n,&m);S = 0,T = n+1,tot = 0;for (int i=0;i<m;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);add(a,b,c,d);A[a] -= c,A[b] += c;//出去c,进来c}for (int i=1;i<=n;i++){if (A[i]>0) add(S,i,0,A[i]),tot += A[i];//如果进来大于0else if (A[i]<0) add(i,T,0,-A[i]);//如果出去}if (dinic()!=tot) printf("NO\n");//如果最低的流量都不行else {printf("YES\n");for (int i=0;i<m*2;i+=2)printf("%d\n",f[i^1]+l[i]);//输出方案}return 0;
}

应用三:有源汇的最大流问题
有源汇上下界最大流 https://www.acwing.com/problem/content/2191/
先链接一个t到s的边,看是否能满足所有边的最小下限
如果满足再做一次dinic()

int main()
{memset(h,-1,sizeof h);int s,t,tot = 0;scanf("%d%d%d%d",&n,&m,&s,&t);S = 0,T = n+1;while (m--){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);add(a,b,d-c);A[a] -= c,A[b] += c;}for (int i=1;i<=n;i++)if (A[i]>0) add(S,i,A[i]),tot += A[i];else if (A[i]<0) add(i,T,-A[i]);add(t,s,INF);if (dinic()<tot) puts("No Solution");else {int res = f[idx-1];f[idx-1] = f[idx-2] = 0;S = s,T = t;printf("%d",res+dinic());}
}

应用四:有源汇的最小流问题
有源汇上下界最小流 https://www.acwing.com/problem/content/2192/
加t到s的边,然后dinic,然后再反向dinic

int main()
{memset(h,-1,sizeof h);int s,t,tot = 0;scanf("%d%d%d%d",&n,&m,&s,&t);S = 0,T = n+1;while (m--){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);add(a,b,d-c);A[a] -= c,A[b] += c;}for (int i=1;i<=n;i++)if (A[i]>0) add(S,i,A[i]),tot += A[i];else if (A[i]<0) add(i,T,-A[i]);add(t,s,INF);if (dinic()<tot) puts("No Solution");else {int res = f[idx-1];f[idx-1] = f[idx-2] = 0;S = t,T = s;printf("%d",res-dinic());}
}

应用五:多源汇的最大流问题
多源汇最大流 https://www.acwing.com/problem/content/2236/

int main()
{memset(h,-1,sizeof h);int ss,tt;scanf("%d%d%d%d",&n,&m,&ss,&tt);S = 0,T = n+1;while (ss--){int x;scanf("%d",&x);add(S,x,INF);}while (tt--){int x;scanf("%d",&x);add(x,T,INF);}while (m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c);}printf("%d\n",dinic());
}

应用六:关键边
伊基的故事 I - 道路重建 https://www.acwing.com/problem/content/2238/
dinic后从S和T遍历

void dfs(int u, bool st[], int t)
{st[u] = true;for (int i = h[u]; ~i; i = ne[i]){int j = i ^ t, ver = e[i];if (f[j] && !st[ver])dfs(ver, st, t);}
}
int main()
{memset(h,-1,sizeof h);scanf("%d%d",&n,&m);for (int i = 0;i<m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c);}S = 0,T = n-1;dinic();dfs(S, vis_s, 0);dfs(T, vis_t, 1);int res = 0;for (int i = 0; i < m * 2; i += 2)if (!f[i] && vis_s[e[i ^ 1]] && vis_t[e[i]])res ++ ;printf("%d\n", res);return 0;
}

应用七:有边大小使用限制的最大流判定
秘密挤奶机 https://www.acwing.com/problem/content/2279/

bool check(int x)
{for (int i=0;i<idx;i++) if (w[i]>x) f[i] = 0;else f[i] = 1;return dinic()>=k;
}
int main()
{memset(h,-1,sizeof h);scanf("%d%d%d",&n,&m,&k);S = 1,T = n;for (int i = 0;i<m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c);}int l = 1,r = 1e6;while (l<r){int mid = l+r>>1;if (check(mid)) r = mid;else l = mid+1;}printf("%d\n",r);return 0;
}

应用八:拆点
餐饮 https://www.acwing.com/problem/content/2242/

int main()
{memset(h,-1,sizeof h);scanf("%d%d%d",&n,&m,&k);S = 0,T = 2*n+m+k+1;for (int i = 2*n+1;i<=2*n+m;i++) add(S,i,1);for (int i = 1;i<=n;i++) add(i,i+n,1);for (int i = 2*n+m+1;i<=2*n+m+k;i++) add(i,T,1);for (int i = 1;i<=n;i++){int a,b,x;scanf("%d%d",&a,&b);for (int j = 0;j<a;j++){scanf("%d",&x);add(2*n+x,i,1);}for (int j = 0;j<b;j++){scanf("%d",&x);add(n+i,2*n+m+x,1);}}printf("%d\n",dinic());return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python简述目录_Python源码下载和目录简介(示例代码)

Python源码下载和目录简介一、Python源码下载1、Linux操作系统下使用终端命令下载&#xff1a;wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz // 获取源码压缩包tar -xf Python-3.7.4.tgz // 解压2、非Linux操作系统下载&#xff1a;(2)滑到最下面&#xff0…

Linux之Ubuntu安装搜狗输入法

1.下载搜狗输入法安装包 搜狗官网&#xff1a;https://pinyin.sogou.com/linux/ 2.更新ubuntu内置的包管理器apt-get的软件源[如果中途安装失败&#xff0c;经常是此原因造成的] sudo apt-get update sudo aot-get upgrade //如果有需要的话 3.dpkg -i &#xff08;下载搜狗下来…

数据结构板子——splay

维护数列 https://www.acwing.com/problem/content/957/ 线段树能写的splay都能写&#xff0c;不过splay常数较大。时间复杂度大概是线段树的三倍 #include<bits/stdc.h> using namespace std; const int N 500010,INF 1e9; int n,m; struct Node {int s[2],p,v;int r…

怎么让wegame适应屏幕大小_iOS的五大设计原则:统一化和适应化原则

昨天米醋跟大家分享了iOS的五大设计原则中凸显内容原则&#xff0c;那么今天我们继续来说说统一化原则和适应化原则。统一化原则统一化原则主要体现在视觉统一和交互统一两个方面。在视觉统一方面&#xff0c;要讲究字体、颜色和元素的统一性&#xff0c;标题字号的统一&#x…

23种设计模式之原型模式代码实例

原型模式就是利用一个克隆”原型“来产生新对象的一种模式&#xff0c; 克隆又分浅克隆与深克隆&#xff0c; 浅克隆&#xff1a;将一个对象复制后&#xff0c;基本数据类型的变量都会重新创建&#xff0c;而引用类型&#xff0c;指向的还是原对象所指向的。 深克隆&#xff1a…

图论模板——费用流(无法处理负环)

费用流 https://www.acwing.com/problem/content/2176/ //最大流的最小费用 #include<bits/stdc.h> using namespace std;const int N 5010, M 100010, INF 1e8;int n,m,S,T; int ne[M],e[M],f[M],w[M],h[N],idx; int q[N],d[N],pre[N],incf[N]; bool st[N];void add…

css调用外部字体

CSS中可以使用font-face属性即可实现调用任何外部等特殊字体。 font-face属性介绍及其实例&#xff1a; 对浏览器的支持&#xff1a; Firefox、Chrome、Safari 以及 Opera 支持 .ttf (True Type Fonts) 和 .otf (OpenType Fonts) 类型的字体。 Internet Explorer 9 支持新的 fo…

python注入点查找_sqlmap常用注入点检测爆破命令

1、检测注入点是否可用python sqlmap.py -u "url"2、从目标url爆破所有数据库名python sqlmap.py -u "url" --dbs3、从目标url爆破当前数据库名python sqlmap.py -u "url" --current-dbs4、列出数据库所有用户python sqlmap.py -u "url&quo…

python如何输入空行_在python中,如何在接受用户输入时跳过空行?

您得到的行为是预期的&#xff0c;请阅读input文档。在input([prompt])If the prompt argument is present, it is written to standard output without a trailing newline. The function then reads a line from input, converts it to a string (stripping a trailing newli…

js层级选择框样式_【JavaWeb】85:jQuery的各种选择器

今天是刘小爱自学Java的第85天。感谢你的观看&#xff0c;谢谢你。话不多说&#xff0c;开始今天的学习&#xff1a;选择器的作用是什么&#xff1f;可以快速准确地定位我们所需要的标签。刚学CSS的时候&#xff0c;觉得CSS选择器也太多了吧&#xff0c;直到今天学了jQuery选择…

python的单例模式

单例模式(Singleton Pattern)&#xff0c;是一种软件设计模式&#xff0c;是类只能实例化一个对象&#xff0c; 目的是便于外界的访问&#xff0c;节约系统资源&#xff0c;如果希望系统中 只有一个对象可以访问&#xff0c;就用单例模式&#xff0c; 显然单例模式的要点有三个…

c语言自定义输出小数点位数_C语言中输出时怎样控制小数点后的位数,请举例说明......

控制2113小数位数就是通过输出格式说明符来规定的举例5261说明如下4102&#xff1a;1、float f13.1415926;2、float f21234.1415926;3、float f3124.1;4、printf("%3.4f",f1);//输出结果为&#xff1a;_ _ 3.1416(_表示空格1653)5、printf("%3.4f",f2);//输…

语言求圆周率近似值改错_新证明解决了如何求无理数的近似值

原文&#xff1a;Kevin Hartnett&#xff0c;QuantaMagazine日前&#xff0c;一份新鲜出炉的论文证明了近80年悬而未决的达芬-谢弗&#xff08;Duffin-Schaeffer&#xff09;猜想&#xff0c;让数轴上讳莫如深的部分再也不如表面看来那么遥不可及。达芬-谢弗猜想的证明完美解答…

python在不同层级目录import模块的方法

转自&#xff1a;https://www.cnblogs.com/luoye00/p/5223543.html 使用python进行程序编写时&#xff0c;经常会使用第三方模块包。这种包我们可以通过python setup install 进行安装后&#xff0c;通过import XXX或from XXX import yyy 进行导入。不过如果是自己遍写的依赖包…

谷歌翻译无法连接网络_window10无法连接网络

很多朋友都将电脑的系统升级到Win10&#xff0c;如果遇到了Win10系统无法连接网络该如何解决&#xff0c;下面就为大家介绍一下解决的方法。window10无法连接网络一、检查路由器1、重新启动(断电10秒钟) 无线路由器和猫(调制解调器)&#xff0c;有时候是路由器的故障&#xff1…

php: +1天, +3个月, strtotime(): +1 day, +3 month

php: 1天, 3个月, strtotime(): 1 day, 3 month 比如&#xff0c;我现在当前时间基础上1天&#xff1a; strtotime("1 day"); 比如我现在&#xff0c;2014-05-01时间上 3个月 $s strtotime("2014-05-01"); $d strtotime("3 month", $s); 转载…

获取弹出的窗口_Win7系统如何获取设置everyone权限的问题

一位win7之家系统的小伙伴&#xff0c;想要在电脑系统中获取everyone权限&#xff0c;但是不知道该怎么做&#xff0c;对于Win7电脑如何获取设置everyone权限这个问题&#xff0c;小编觉得我们可以在电脑的计算机中找到相关的磁盘&#xff0c;打开磁盘属性然后在安全选项中进行…

异步请求中jetty处理ServletRequestListener的坑

标题起得比较诡异&#xff0c;其实并不是坑&#xff0c;而是jetty似乎压根就没做对异步request的ServletRequestListener的特殊处理&#xff0c;如果文中有错误欢迎提出&#xff0c;可能自己有所疏漏了。 之前遇到了一个bug&#xff0c;在Listener中重写requestDestroyed清理资…

Maven国内镜像 Maven阿里云镜像

<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> 转载于:https://www.cnblogs.com/a2b1/p/787…

华为h22h05服务器做raid_华为V5服务器 RAID控制卡(LSI SAS3008IR)

提供高速接口和模块LSI SAS3008IR的PCIe Core提供PCIe x8接口&#xff0c;每lane速率为8Gb/s&#xff0c;可以兼容x1、x2、x4配置&#xff1b;支持PCIe 3.0规格&#xff0c;兼容PCIe 2.x和PCIe 1.x。LSI SAS3008IR的SAS模块提供SAS功能&#xff0c;并定义支持的硬盘速率。LSI S…