思路:

根据最大流最小割定理可得最大流与最小割相等,所以可以先跑一遍EdmondsKarp算法。
接下来要求的是经过最小割切割后的图中$S$所属的点集。
本来的思路是用并查集处理所有前向边构成的残量网络,如果当前边的残量不为零,则合并两个端点。
然而这样子会WA,因为这只适用于无向图的情况,而流网络属于有向图。
解决的方法是用一个DFS,处理出所有从$S$出发可到达的点,如果边的残量为零则说明当前边不可用。

  1. #include<set>
  2. #include<queue>
  3. #include<cstdio>
  4. #include<cctype>
  5. #include<vector>
  6. #include<cstring>
  7. inline int getint() {
  8. char ch;
  9. while(!isdigit(ch=getchar()));
  10. int x=ch^'';
  11. while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
  12. return x;
  13. }
  14. const int N=,M=,inf=0x7fffffff;
  15. struct Edge {
  16. int from,to,remain;
  17. };
  18. Edge e[M<<];
  19. std::vector<int> g[N];
  20. int sz=;
  21. inline void add_edge(const int u,const int v,const int w) {
  22. e[sz]=(Edge){u,v,w};
  23. g[u].push_back(sz);
  24. sz++;
  25. }
  26. int n,m,s,t;
  27. int a[N],p[N];
  28. inline int Augment() {
  29. memset(a,,sizeof a);
  30. a[s]=inf;
  31. std::queue<int> q;
  32. q.push(s);
  33. while(!q.empty()&&!a[t]) {
  34. int x=q.front();
  35. q.pop();
  36. for(unsigned i=;i<g[x].size();i++) {
  37. Edge &y=e[g[x][i]];
  38. if(!a[y.to]&&y.remain) {
  39. p[y.to]=g[x][i];
  40. a[y.to]=std::min(a[x],y.remain);
  41. q.push(y.to);
  42. }
  43. }
  44. }
  45. return a[t];
  46. }
  47. inline int EdmondsKarp() {
  48. int maxflow=;
  49. while(int flow=Augment()) {
  50. for(int i=t;i!=s;i=e[p[i]].from) {
  51. e[p[i]].remain-=flow;
  52. e[p[i]^].remain+=flow;
  53. }
  54. maxflow+=flow;
  55. }
  56. return maxflow;
  57. }
  58. bool v[N]={};
  59. std::vector<int> ans;
  60. inline void FindSet(const int x) {
  61. v[x]=true;
  62. ans.push_back(x);
  63. for(unsigned int i=;i<g[x].size();i++) {
  64. if((g[x][i]&)||v[e[g[x][i]].to]||!e[g[x][i]].remain) continue;
  65. FindSet(e[g[x][i]].to);
  66. }
  67. }
  68. int main() {
  69. n=getint(),m=getint();
  70. s=,t=n;
  71. while(m--) {
  72. int u=getint(),v=getint(),w=getint();
  73. add_edge(u,v,w);
  74. add_edge(v,u,);
  75. }
  76. printf("%d ",EdmondsKarp());
  77. FindSet(s);
  78. printf("%u\n",ans.size());
  79. for(unsigned int i=;i<ans.size()-;i++) {
  80. printf("%d ",ans[i]);
  81. }
  82. printf("%d\n",ans.back());
  83. return ;
  84. }

[HihoCoder1378]网络流二·最大流最小割定理的更多相关文章

  1. hihocoder 网络流二·最大流最小割定理

    网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? ...

  2. 【hihocoder 1378】网络流二·最大流最小割定理

    [Link]:http://hihocoder.com/problemset/problem/1378 [Description] [Solution] 在求完最小割(最大流)之后; 可以在剩余网络中 ...

  3. hiho 第116周,最大流最小割定理,求最小割集S,T

    小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c ...

  4. 【codevs1907】方格取数3(最大流最小割定理)

    网址:http://codevs.cn/problem/1907/ 题意:在一个矩阵里选不相邻的若干个数,使这些数的和最大. 我们可以把它看成一个最小割,答案就是矩阵中的所有数-最小割.先把矩阵按国际 ...

  5. 牛客暑期第六场G /// 树形DP 最大流最小割定理

    题目大意: 输入t,t个测试用例 每个测试用例输入n 接下来n行 输入u,v,w,树的无向边u点到v点权重为w 求任意两点间的最大流的总和 1.最大流最小割定理 即最大流等于最小割 2.无向树上的任意 ...

  6. [最短路,最大流最小割定理] 2019 Multi-University Training Contest 1 Path

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6582 Path Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  7. [网络流24题#9] [cogs734] 方格取数 [网络流,最大流最小割]

    将网格分为两部分,方法是黑白染色,即判断(i+j)&1即可,分开后从白色格子向黑色格子连边,每个点需要四条(边界点可能更少),也就是每个格子周围的四个方向.之后将源点和汇点分别于黑白格子连边, ...

  8. cogs750栅格网络流(最小割)

    750. 栅格网络流 ★★☆   输入文件:flowa.in   输出文件:flowa.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] Bob 觉得一般图的最大流问题太 ...

  9. 最大流最小割——bzoj1001狼抓兔子,洛谷P2598

    前置知识 平面图 平面图就是平面上任意边都不相交的图.(自己瞎画的不算XD) 对偶图 比如说这个图,我们发现平面图肯定会把平面分成不同的区域(感觉像拓扑图),并把这些区域当做每个点(不被包围的区域独自 ...

随机推荐

  1. mybatis异常分析jdbcType

    Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: Error setti ...

  2. bootstrap 的媒体查询

    有时候需要对bootstap的样式自定义,比如说某个元素的“height”值,要放在与bootstrap媒体查询同步的样式里,才会兼容响应式布局. .container类是bootstrap的官方参考 ...

  3. Project Euler Problem9

    Special Pythagorean triplet Problem 9 A Pythagorean triplet is a set of three natural numbers, a  b  ...

  4. nagios系列(四)之nagios主动方式监控tcp常用的80/3306等端口监控web/syncd/mysql及url服务

    nagios主动方式监控tcp服务web/syncd/mysql及url cd /usr/local/nagios/libexec/ [root@node4 libexec]# ./check_tcp ...

  5. Expm 7_1树中的最大独立集问题

    [问题描述] 给定一个无回路的无向图(即树),设计一个动态规划算法,求出该图的最大独立集,并输出该集合中的各个顶点值. package org.xiu68.exp.exp7; import java. ...

  6. 深度学习Bible学习笔记:第二、三章 线性代数 概率与信息论

    推荐资源: <线性代数的本质>:Essence of linear algebra 视频教程 <数学之美>(科普类书籍),吴军系列书籍都不错. 易向军<大嘴巴漫谈数据挖掘 ...

  7. pytest十二:cmd命令行参数

    命令行参数是根据命令行选项将不同的值传递给测试函数,比如平常在 cmd 执行”pytest —html=report.html”,这里面的”—html=report.html“就是从命令行传入的参数对 ...

  8. 【Algorithm | 链表】单链表“环”、“环的起点”、“环的长度”问题

    参考资料 • Floyd判圈算法 { 链接 } • 单链表“环”.“环的起点”.环的长度”问题 { 链接 } 链表环的问题 一.判断链表有换 使用两个指针slow和fast.两个指针开始时均在头节点处 ...

  9. 去掉m3u8的片头和片尾

    # pip3 install -i https://mirrors.aliyun.com/pypi/simple/ m3u8 # pip3 install -i https://mirrors.ali ...

  10. 腾讯浏览服务X5内核集成

    腾讯浏览服务X5内核集成https://www.jianshu.com/p/8a7224ff371a TBS 腾讯浏览器服务接入文档https://x5.tencent.com/tbs/guide/s ...