题目大意是给一张网络,网络可能存在不同边集的最小割,求出拥有最少边集的最小割,最少的边是多少条?

思路:题目很好理解,就是找一个边集最少的最小割,一个方法是在建图的时候把边的容量处理成C *(E+1 )+1,C是初始容量,E是边的个数,假设之前不做此操作处理求得最大流是maxf,处理之后跑dinic求出的最大流就是 maxf *(E+1)+ n , n就代表用了几条边,其中 n 必定是小于 E+1的,这样把处理之后的最大流模上(E+1)得到n,其中n就是最小割的边数,因为每用到一条边得到的最大流就会+1,那么+n就是用了n条边,这个n就是最少边集的个数。

AC 代码:

  1. #include<iostream>
  2. #include<queue>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstring>
  6. using namespace std;
  7. const int maxn = 205;
  8. const int MAX = 0x3f3f3f3f;
  9. struct node{
  10. vector<int> vex;//某个节点连接的点
  11. vector<int> num;//连接节点边的序号
  12. }g[maxn];
  13. struct edge{
  14. int u,v,c;
  15. }e[maxn*maxn];
  16. int edgenum,sp,tp;
  17. int d[maxn];
  18. void addedge(int u,int v,int c){
  19. e[edgenum].u = u;
  20. e[edgenum].v = v;
  21. e[edgenum].c = c;
  22. g[u].vex.push_back(v),g[u].num.push_back(edgenum++);
  23. // 建立双向边操作
  24. e[edgenum].u = v;
  25. e[edgenum].v = u;
  26. e[edgenum].c = 0;
  27. g[v].num.push_back(edgenum++),g[v].vex.push_back(u);
  28. }
  29. int bfs(){
  30. memset(d,-1,sizeof(d));
  31. queue<int> q;
  32. q.push(sp);
  33. d[sp] = 0;
  34. while(!q.empty()){
  35. int now = q.front();
  36. q.pop();
  37. for(int i = 0;i<g[now].vex.size() ;i++ ){
  38. int tv = g[now].vex[i];
  39. int te = g[now].num[i];
  40. if(e[te].c > 0 && d[tv] == -1){
  41. d[tv] = d[now] + 1;//增加深度
  42. q.push(tv);
  43. }
  44. }
  45. }
  46. return d[tp]!=-1;
  47. }
  48. int dfs(int a,int b){
  49. int r = 0;
  50. if(a == tp){
  51. return b;
  52. }
  53. for(int i = 0;i<g[a].num.size()&& r<b ;i++ ){
  54. int tv = g[a].vex[i];
  55. int te = g[a].num[i];
  56. if(e[te].c > 0 && d[tv] == d[a] + 1){
  57. int tc = min(e[te].c ,b - r);//求出可以流过的流量
  58. tc = dfs(tv,tc);//递归寻找增广路
  59. r+=tc;
  60. e[te].c-=tc;
  61. e[te^1].c+=tc;
  62. }
  63. }
  64. if(!r){
  65. d[a] = -2;
  66. }
  67. return r;
  68. }
  69. int dinic(){
  70. int total = 0;
  71. while(bfs()){
  72. while(1){
  73. int t = dfs(sp,MAX);
  74. if(!t){//找不到增广路,t=0,循环终止
  75. break;
  76. }
  77. total+=t;
  78. }
  79. }
  80. return total;
  81. }
  82. int main(){
  83. int t;
  84. cin>>t;
  85. while(t--){
  86. int n,m;
  87. cin>>n>>m;
  88. cin>>sp>>tp;
  89. edgenum = 0;
  90. for(int i = 0;i<maxn;i++){
  91. g[i].num.clear() ,g[i].vex.clear() ;
  92. }
  93. for(int i = 0;i<m;i++){
  94. int u,v,w;
  95. cin>>u>>v>>w;
  96. addedge(u,v,w*(m+1)+1); //边容量扩大
  97. }
  98. int ans = dinic();
  99. cout<<ans%(m+1)<<endl;
  100. }
  101. return 0;
  102. }

hdu 6214 Smallest Minimum Cut(最小割的最少边数)的更多相关文章

  1. HDU 6214 Smallest Minimum Cut 最小割,权值编码

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 题意:求边数最小的割. 解法: 建边的时候每条边权 w = w * (E + 1) + 1; 这 ...

  2. HDU 6214 Smallest Minimum Cut (最小割且边数最少)

    题意:给定上一个有向图,求 s - t 的最小割且边数最少. 析:设边的容量是w,边数为m,只要把每边打容量变成 w * (m+1) + 1,然后跑一个最大流,最大流%(m+1),就是答案. 代码如下 ...

  3. hdu 6214 Smallest Minimum Cut[最大流]

    hdu 6214 Smallest Minimum Cut[最大流] 题意:求最小割中最少的边数. 题解:对边权乘个比边大点的数比如300,再加1 ,最后,最大流对300取余就是边数啦.. #incl ...

  4. HDU 6214.Smallest Minimum Cut 最少边数最小割

    Smallest Minimum Cut Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Oth ...

  5. HDU 6214 Smallest Minimum Cut 【网络流最小割+ 二种方法只能一种有效+hdu 3987原题】

    Problem Description Consider a network G=(V,E) with source s and sink t . An s-t cut is a partition ...

  6. HDU 6214 Smallest Minimum Cut(最少边最小割)

    Problem Description Consider a network G=(V,E) with source s and sink t. An s-t cut is a partition o ...

  7. hdu 6214 : Smallest Minimum Cut 【网络流】

    题目链接 ISAP写法 #include <bits/stdc++.h> using namespace std; typedef long long LL; namespace Fast ...

  8. POJ 2914 Minimum Cut 最小割图论

    Description Given an undirected graph, in which two vertices can be connected by multiple edges, wha ...

  9. POJ2914 Minimum Cut —— 最小割

    题目链接:http://poj.org/problem?id=2914 Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Sub ...

随机推荐

  1. VS打包程序步骤

    1.下载打包的程序 2.在你的程序里面安装打包的项目 3.添加项目输出 4.为项目添加必要的文件 双击前面建立好的主输出 一般文件为一些配置文件(如使用Nlog写日志,需要添加Nlog的配置文件)和图 ...

  2. window服务session隔离

    在window服务中抓取窗体是做不到的,因为window系统的session隔离机制:如果想要调用外部程序,可以通过 创建代理进程 进行操作(通过非托管代码CreateProcessAsUser函数进 ...

  3. react-native构建基本页面1---主页:tab栏

    配置Tab栏 配置Tab栏的图标 注意:使用图标,需要接收 license; /** * Sample React Native App * https://github.com/facebook/r ...

  4. 杭电oj 1087——super jump!jump!jump(java实现)

    question:Super Jumping! Jumping! Jumping! 意思就是找一串数字中的和最大子串 思路:创建另一个数组,每一项是路径数组对应项之前最大子串的和,然后遍历此数组找出最 ...

  5. 如何通过给MM修电脑培养感情

    文章来自网络 在修之前,向MM反复声明,这电脑故障是有硬件和软件之分的,如果是硬件故障,例如显卡风扇不转了,显示器连线老化,显示器分辨率超出显示器指标,等等都会导致黑屏啊,这个我不回家用专门的工具是修 ...

  6. idea的插件库连不上网络

    如果你试遍了网上的方法都没有解决网络问题,建议换个网络,比如切换到电信网络.

  7. MFC在子线程中创建窗口(PostMessage方法)

    1.创建子线程 C++创建线程的方式比较多 1)最简单易用的<thread>头文件,但是这种方法创建的子线程中无法给主线程PostMessage消息(也可能是我操作有误,总之没成功) 2) ...

  8. 155.XSS攻击原理

    XSS攻击: XSS(Cross Site Script)攻击叫做跨站脚本攻击,他的原理是用户使用具有XSS漏洞的网站的时候,向这个网站提交一些恶意代码,当用户在访问这个网站的某个页面的时候,这个恶意 ...

  9. 谈谈近期学习Nativejs和reactNative的一些感受

    因为前段时间,对dcloud推出的Nativejs和facebook推出的reactNative都做了一点点浅薄的研究.因为研究的很浅薄,所以仅代表我个人观点,谈谈对运用这两个产品的些许感受. 说起d ...

  10. vs code使用指南

    https://blog.csdn.net/weixin_45601379/article/details/100550421