http://acm.hdu.edu.cn/showproblem.php?pid=3987
割边必然是满流的边
方法一:
重新建图,将满流的边改为容量为1,非满流的边改为容量为INF。再跑一边最大流就是割边的个数。
(要注意的是,改图的时候,应该对正向边进行判断,cap == 0则为满流)
方法二:
建图时,每条边的cap = cap*(E+1) + 1,则最后的最小割就是max_flow / (E+1) ,割边的个数就是max_flow%(E+1)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int M_node = 1090,M_edge = 500009,INF = 0x3f3f3f3f;
struct edge
{int to,cap,next;bool is_rev;
}edge[M_edge],edge2[M_node];
int head[M_node],level[M_node];
int pre[M_node];
int tot;
int n,m;
int s,t;
int ss,tt;
int vis[M_node];
void init()
{memset(head,-1,sizeof(head));tot = 0;memset(vis,0,sizeof(vis));
}
void add_edge(int u,int v,int cap)
{edge[tot].to = v;edge[tot].cap = cap;edge[tot].is_rev = false;edge[tot].next = head[u];head[u] = tot++;edge[tot].to = u;edge[tot].cap = 0;edge[tot].is_rev = true;edge[tot].next = head[v];head[v] = tot++;
}
bool bfs(int s,int t)
{memset(level,-1,sizeof(level));level[s] = 0;queue<int> q;q.push(s);while(!q.empty()){int v = q.front();q.pop();for(int i = head[v];i != -1;i = edge[i].next){int u = edge[i].to;if(level[u] < 0 && edge[i].cap > 0){level[u] = level[v] + 1;q.push(u);}}}return level[t] != -1;
}
int dfs(int v,int t,int f)
{if(v == t) return f;for(int &i = pre[v];i != -1;i = edge[i].next){int u = edge[i].to;if(level[u] > level[v] && edge[i].cap > 0){int d = dfs(u,t,min(f,edge[i].cap));if(d > 0){edge[i].cap -= d;edge[i^1].cap += d;//pre[v] = i;//printf("i = %d,v = %d,u = %d, d = %d\n",i,v,u,d);//printf("edge[i].cap = %d\n",edge[i].cap);return d;}}}level[v] = -1;return 0;
}
int max_flow(int s,int t)
{int flow = 0;while(bfs(s,t)){for(int i = 0;i <= t;i++) pre[i] = head[i];int f = 0;while((f = dfs(s,t,INF)) > 0) flow += f;}return flow;
}
int main()
{int T;scanf("%d",&T);int kas = 1;while(T--){scanf("%d%d",&n,&m);init();for(int i = 0;i < m;i++){int u,v,cost,b;scanf("%d%d%d%d",&u,&v,&cost,&b);if(b){add_edge(u,v,cost);add_edge(v,u,cost);}else add_edge(u,v,cost);}s = n;t = n + 1;add_edge(s,0,INF);add_edge(n-1,t,INF);int ans = max_flow(s,t);//printf("debug ---- ans = %d\n",ans);for(int i = 0;i < n;i++){for(int j = head[i];j != -1;j = edge[j].next){if(edge[j].cap == 0 && edge[j].is_rev == false){edge[j].cap = 1;edge[j^1].cap = 0;//add_edge(t+1+i,t+1+edge[j].to,1);//printf("add_edge u = %d,v = %d\n",i,edge[j].to);}else if(edge[j].is_rev == false){edge[j].cap = INF;edge[j^1].cap = 0;}//add_edge(t+1+i,t+1+edge[j].to,INF);}}ans = max_flow(s,t);printf("Case %d: %d\n",kas++,ans);}return 0;
}

hdu 3987 求割边最少的最小割相关推荐

  1. 【HDU】4859 海岸线 黑白染色+最小割

    传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...

  2. HDU 5457 Hold Your Hand【最小割+字典树】

    在这里先感谢YYN菊苣对我解题的帮助. 首先,我们按照前缀和后缀建立两棵字典树. 节点总数为256∗8∗2256*8*2,每一个叶子节点是我们的数字. 其次,我们对读入的操作来更新字典树,假设字典树有 ...

  3. [USACO Section 4.4]追查坏牛奶Pollutant Control (最小割)

    题目链接 Solution 一眼看过去就是最小割,但是要求割边最少的最小的割. 所以要用骚操作... 建边的时候每条边权 \(w = w * (E+1) + 1;\) 那么这样建图跑出来的 \(max ...

  4. HDU 4859 海岸线 最小割

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把'E'变 ...

  5. poj 2914(stoer_wanger算法求全局最小割)

    题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t   V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...

  6. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)...

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形.方格取数2解法: ...

  7. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

  8. 【网络流-最小割】USA4.4——追查坏牛奶Pollutant Control

    前言 你说你是个网络流的题,就算了嘛,还要输出方案,啧啧啧... 题目 题目描述 你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶.很不幸,你发现这件事的时候,有三 ...

  9. BZOJ3996 [TJOI2015]线性代数 【最小割】

    题目 给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 D=(AB-C)A^T最大.其中A^T为A的转置.输出D 输入格式 第一行输入一个整数N,接下来N行输入B矩阵,第i行第 ...

  10. BZOJ 1412 [ZJOI2009]狼和羊的故事(最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1412 [题目大意] 给出一块地图,1表示狼的领地,2表示羊的领地,0表示其余动物的领地 ...

最新文章

  1. 清除Squid缓存的小工具
  2. 基于hsv的亮度调整算法_改变HSV的H和V部分(比如可以增加图像亮度)
  3. python utc时间转换为strftime
  4. TF之AutoML框架:AutoML框架的简介、特点、使用方法详细攻略
  5. TPYBoard:一款可以发挥无限创意的MicroPython开发板
  6. 爆火“捏脸”APP崽崽ZEPETO,如何开启虚拟世界的社交IP?
  7. 2019,从刷新你的运营知识库开始!
  8. VTK:二次可视化用法实战
  9. SQL入门(3):定义约束/断言assertion/触发器trigger
  10. SQL——连接查询、聚合函数、开窗函数、分组功能、联合查询、子查询
  11. wpa_supplicant2.9编译过程
  12. 科技大停滞--过去已逝,未来未来
  13. 获取元素的 CSS 样式
  14. MATLAB 8.1 R2013a license.lic 问题
  15. 女程序员在公司受到的待遇有什么不一样?
  16. 针对屏幕显示模糊/清晰度不够的3种调节途径
  17. JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类
  18. Sping +hibernate+JTA 注解配置
  19. 给osg配置bullet物理引擎
  20. 多重宇宙与单一宇宙:科学真的能解释永恒的过去和未来吗?

热门文章

  1. 【GPL和LGPL】【VPlayer不开源】【其他开源的基本都仅是ffmpeg修改部分】
  2. Unity5.6 VideoPlayer用法
  3. 引用arXiv的文章标准的Latex的bib如何编辑
  4. 震动活塞式柱状取样器的使用
  5. SpringBoot集成Elasticsearch 进阶,实现中文、拼音分词,繁简体转换高级搜索
  6. 碎片化知识管理工具Memos
  7. zynq-7000系列基于zynq-zed的vivado初步设计之linux下控制PL扩展的UART
  8. 【迅为6818开发板资料】安卓7.1 系统编译手册
  9. Python3 Scrapy + Selenium + 阿布云爬取拉钩网学习笔记
  10. 拉钩网前端项目实战02