在最大流模板的基础上,求出最小割集

题目链接:hihocoder 1378

#include<iostream>
#include<stdio.h>
#include<math.h>
#include <string>
#include<string.h>
#include<map>
#include<queue>
#include<set>
#include<utility>
#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define maxn 20005
#define maxm 100005
#define rd(x) scanf("%d", &x)
#define rd2(x, y) scanf("%d%d", &x, &y)const int INF = 0x3f3f3f3f;
struct Edge{int to, next, cap, flow;
}edge[maxm];
int tol, head[maxn];
int gap[maxn], dep[maxn], pre[maxn], cur[maxn];
void init(){tol = 0;memset(head, -1, sizeof(head));
}
void addedge(int u, int v, int w, int rw = 0){edge[tol].to = v; edge[tol].cap = w; edge[tol].next = head[u];edge[tol].flow = 0; head[u] = tol++;edge[tol].to = u; edge[tol].cap = rw; edge[tol].next = head[v];edge[tol].flow = 0; head[v] = tol++;
}
int sap(int st, int ed, int N){memset(gap, 0 ,sizeof(gap));memset(dep, 0 ,sizeof(dep));memcpy(cur, head, sizeof(head));int u = st;pre[u] = -1;gap[0] = N;int ans = 0;while(dep[st] < N){if(u == ed){int Min = INF;for(int i = pre[u]; i != -1; i = pre[edge[i^1].to])if(Min > edge[i].cap - edge[i].flow)Min = edge[i].cap - edge[i].flow;for(int i = pre[u]; i != -1; i = pre[edge[i^1].to]){edge[i].flow += Min;edge[i^1].flow -= Min;}u = st;ans += Min;continue;}bool flag = false;int v;for(int i = cur[u]; i != -1; i = edge[i].next){v = edge[i].to;if(edge[i].cap - edge[i].flow && dep[v] + 1 == dep[u]){flag = true;cur[u] = pre[v] = i;break;}}if(flag){u = v;continue;}int Min = N;for(int i = head[u]; i!= -1; i = edge[i].next){if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min){Min = dep[edge[i].to];cur[u] = i;}}gap[dep[u]]--;if(!gap[dep[u]]) return ans;dep[u] = Min + 1;gap[dep[u]]++;if(u != st) u = edge[pre[u]^1].to;}return ans;
}
/*求最小割集*/
set<int> sset;
int lvl[maxn];
void bfs(){queue<int> q;memset(lvl, 0 ,sizeof(lvl));q.push(1);lvl[1] = 1;while(!q.empty()){int u = q.front();sset.insert(u);q.pop();for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(lvl[v] == 0 && edge[i].cap > edge[i].flow){lvl[v] = lvl[u] + 1;/*这里edge[i]就是最小割里的边了*/q.push(v);}}}
}int main()
{int n, m, a, b, c;init();rd2(n, m);for(int i = 1; i <= m; i++){scanf("%d%d%d", &a, &b, &c);addedge(a,b,c);}int maxflow = sap(1, n, n);bfs();printf("%d %d\n", maxflow, sset.size());for(set<int>::iterator it = sset.begin(); it != sset.end(); it++){if(it != sset.begin()) printf(" ");printf("%d", *it);}printf("\n");return 0;
}

hihocoder 1378(有向图求最小割集)相关推荐

  1. 下行法求最小割集案例_机械产品典型失效分析案例

    原标题:机械产品典型失效分析案例 长期以来,机械结构设计习惯于传统的静强度设计,然而实际工作中,多数机械产品不属于静载工作范畴.大量的产品失效案例表明,百分之70以上的产品失效属于疲劳问题,另外有百分 ...

  2. UVA11889(给出lcm(A,B)=C中的AC求最小的B)

    题意:      给出最小公倍数LCM(A,B) = C中的A,C求最小的B. 思路:       lcm=(a*b)/gcd,把等号两侧同时除以a得到lcm/a=b/gcd左侧是已知的,右侧的gcd ...

  3. 试除法求最小N个素数之二

    Trial division 试除法求最小N个素数是一个经典的算法. 这个算法不同于前一个版本<试除法求最小N个素数>的方法,也是一个比较快速的方法. 这个算法考虑以下两点: 1.偶数中只 ...

  4. 一种更简单的求最小平方均值函数(MSE)的方法 -- 梯度下降法。

    在上一篇博客中我们通过解析解法算出来了 但是上面公式中的对称阵是N维乘以N维的,复杂度为O(n*n*n),虽然很精准但是很慢. 为此我们引入梯度下降法 我们首先大致画出MSE的图像,MSE是一个开口向 ...

  5. hdu3491 最小点割集(无向图求最小点割集通用方法)

    无向图最小点割集,确定起点S,终点T.每个点都有自己的点权值vi,求最小点权和的割点集,使得S无法到达T. 解法:将每个点拆分为两个点v和v',之间的权值为vi(单向边),将原图中的每条边赋权值为IN ...

  6. 求最小码距 (10 分)

    求最小码距 (10 分) 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 题目描述 计算机组成原理老师给小明出了一道求最小码距的题目, 有以下由1个字节组成的合法编码集{0xA ...

  7. 7-3 求最小码距 (10 分)

    计算机组成原理老师给小明出了一道求最小码距的题目, 有以下由1个字节组成的合法编码集{0xA9,0xC7,0xDF,0xBE},该编码集的最小码距是__ 小明知道码距,也知道最小码距的概念.码距是指 ...

  8. 7-3 求最小码距(完整版) (10 分)

    7-3 求最小码距(完整版) (10 分) 计算机组成原理老师给小明出了一道求最小码距的题目, 有以下由1个字节组成的合法编码集{0xA9,0xC7,0xDF,0xBE},该编码集的最小码距是__小明 ...

  9. 利用Kuhn-Munkras算法求最小权值匹配

    本文参考博客: http://blog.csdn.net/zhangpinghao/article/details/12242823(代码参考该博客) http://philoscience.itey ...

  10. CGAL求最小外包矩形

    有两种所谓的最小外包矩形,第一种通过求所有节点的最小与最大xy来求的,这种叫与坐标轴平行的最小外包矩形:另外一种则是本文说的这种,与范围的形状与走势有关的,叫非坐标轴平行的最小外包矩形,效果如下图所示 ...

最新文章

  1. 微软推出的Pylance,随着VS Code的更新,性能又前进了一步
  2. GetModuleHandle(NULL)获取当前DLL模块基址?
  3. 使用jQuery清空file文件域的解决方案
  4. C++ 4 种具有更 为准确语义的新强制转换类型
  5. 自动化测试神器 之 python unittest 断言
  6. win2012R2无法打开匿名级安全令牌,安装.net 3.5
  7. 物联网之卫星导航系统
  8. 网络就好似一个个树洞
  9. Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播
  10. 光伏龙头们掀起垂直一体化狂潮
  11. 科学防疫宣传实践总结报告
  12. ps制作苹果中的返回按钮
  13. 点坐标(点云)表示的模型转为.stl文件用于3D打印
  14. 【数据结构 严蔚敏版】 二叉树 基本操作
  15. 深入理解光电二极管恒流特性与电压电流检测电路原理
  16. java发送邮件时获取uid
  17. 用Python编写的五子棋程序1.0版
  18. 中国大陆22所高校上榜!2022QS毕业生就业竞争力排名发布;​2022中国企业薪资增长率预计为5.3% | 美通社头条...
  19. 互联网大脑架构分析之腾讯:至少已布局三大AI实验室
  20. 机器学习新-统计机器学习第二版

热门文章

  1. 什么软件测试情侣头像,情侣头像另一半怎么找,请问什么软件可以找出
  2. 使用Word制作签名电子版
  3. 【C#】NPOI导出Excel格式设置
  4. oracle中imp命令详解,Oracle使用imp命令导入数据详解
  5. Git 团队协作常用术语 WIP PTAL CC LGTM
  6. 八款值得尝试的精美的 Linux 发行版(2017 版)
  7. 嘉腾发布“守护者I”抗疫机器人
  8. 按摩椅控制板的开发让按摩椅变得简约智能
  9. 如何去除Excel图表网格线?
  10. 解决网页文字不能复制,复制网页文字的方法