题意:给定一个无向图,要求判定分离两个点的最小割是否唯一。

解法:在求出最大流的基础上,从源点进行一次搜索,搜索按照未饱和的边进行,得到顶点子集S的顶点个数;再从汇点反向搜索未饱和的边,得到子集T的顶点个数,判定顶点数相加是否等于总共的顶点数。

http://blog.csdn.net/waitfor_/article/details/7330437的文章写的很好,这里截取文中所画的两个图进行说明。

(1)正向搜索集合为S,反向搜索集合为T,cnt1和cnt2都是最小割边。很显然M还存在着最小割边,因为从M到T的残余网络也没有流向T的容量了。

(2)增加E1这部分边的容量将直接导致网络最大流量增加。增加E2和E3则不然。同样M中存在并上E1后为割边的边集。

(3)两条割边完全重合为一条,此时网络中的割边唯一。

代码如下:

View Code

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;const int SS = 805, TT = 806;
const int INF = 0x3fffffff;
int N, M, A, B;struct Edge {int v, c, next;
};
Edge e[30000];
int idx, head[810], lv[810];
int front, tail, que[810];
int vis[810];void insert(int a, int b, int c) {e[idx].v = b, e[idx].c = c;e[idx].next = head[a];head[a] = idx++;
}bool bfs() {memset(lv, 0xff, sizeof (lv));front = tail = lv[SS] = 0;que[tail++] = SS;while (front < tail) {int u = que[front++];for (int i = head[u]; i != -1; i = e[i].next) {int v = e[i].v;if (!(~lv[v]) && e[i].c) {lv[v] = lv[u] + 1;if (v == TT) return true;que[tail++] = v;    }}}return false;
}int dfs(int u, int sup) {if (u == TT) return sup;int tf = 0, f;for (int i = head[u]; i != -1; i = e[i].next) {int v = e[i].v;if (lv[u]+1==lv[v] && e[i].c && (f=dfs(v, min(e[i].c, sup-tf)))) {tf += f;e[i].c -= f, e[i^1].c += f;if (tf == sup) return sup;    }}if (!tf) lv[u] = -1;return tf;
}void dinic() {int ret = 0;while (bfs()) {ret += dfs(SS, INF);    }
//    printf("ret = %d\n", ret);
}void flood(int u, int &cnt) {for (int i = head[u]; i != -1; i = e[i].next) {if (e[i].c && !vis[e[i].v])    {++cnt;vis[e[i].v] = 1;flood(e[i].v, cnt);}}
}void flood_r(int u, int &cnt) {for (int i = head[u]; i != -1; i = e[i].next) {if (e[i^1].c && !vis[e[i].v])    {++cnt;vis[e[i].v] = 1;flood_r(e[i].v, cnt);}}
}bool query() {int cnta = 0, cntb = 0; // 分别为从两个方向进行搜索而计数memset(vis, 0, sizeof (vis));vis[SS] = vis[TT] = 1;flood(SS, cnta);memset(vis, 0, sizeof (vis));vis[SS] = vis[TT] = 1;flood_r(TT, cntb);return cnta + cntb == N;
}int main() {while (scanf("%d %d %d %d", &N, &M, &A, &B), N|M|A|B) {int a, b, c;idx = 0;memset(head, 0xff, sizeof (head));insert(SS, A, INF), insert(A, SS, 0);insert(B, TT, INF), insert(TT, B, 0);for (int i = 0; i < M; ++i) {scanf("%d %d %d", &a, &b, &c);insert(a, b, c), insert(b, a, c);}dinic();printf(query() ? "UNIQUE\n" : "AMBIGUOUS\n");}return 0;
}

转载于:https://www.cnblogs.com/Lyush/archive/2013/05/01/3053640.html

ZOJ-2587 Unique Attack 最小割的唯一性判定相关推荐

  1. ZOJ 2587 Unique Attack

    ZOJ_2587 这个题目本质上就是去判断最小割是否为1,在做完最大流之后的图上,我们从S出发沿非满流的边能走到的点一定是属于S集合的,其余能够沿非满流边走到T的点一定是属于T集合的,如果这时还没有覆 ...

  2. zoj 2874 amp; poj 3308 Paratroopers (最小割)

    意甲冠军: 一m*n该网络的规模格.详细地点称为伞兵着陆(行和列). 现在,在一排(或列) 安装激光枪,激光枪可以杀死线(或塔)所有伞兵.在第一i安装一排 费用是Ri.在第i列安装的费用是Ci. 要安 ...

  3. ZOJ - 2676 Network Wars(01分数规划+最小割)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边组成的无向带权图,现在需要求一个将点 1 和点 n 分开的割集 C ,使得 最小 题目分析:分数式为总权值比上边的数量,换句话说就是一条边只 ...

  4. bzoj1797 最小割唯一性问题

    题目大意 有两问: 判断一条边是否可以在最小割中: 判断一条边是否一定在最小割中. 做法: 首先做一遍最大流得到残量网络. 第一问 对于第一问,我们设这条边为 (u,v) (u,v). 则残量网络上从 ...

  5. 最小割分治(最小割树):BZOJ2229 BZOJ4519

    定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...

  6. BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)

    BZOJ 3218 UOJ #77 A+B Problem (主席树.最小割) 大名鼎鼎的A+B Problem, 主席树优化最小割-- 调题死活调不对,一怒之下改了一种写法交上去A了,但是改写法之后 ...

  7. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

  8. ZOJ2930 The Worst Schedule(最小割)

    题目大概说有n个任务,每个任务可以提前或推迟,提前或推迟各有一定的费用,有的任务一旦推迟另一个任务也必须推迟,问怎么安排任务使花费最少,且最少花费的条件下提前的任务数最多能多少. 问题就是要把各个任务 ...

  9. 【HDU - 5889】Barricade(最短路+网络流,最小割)

    题干: The empire is under attack again. The general of empire is planning to defend his castle. The la ...

最新文章

  1. 红旗Linux软件开发技术,中科红旗闷声研发下一代红旗Linux 11操作系统
  2. java凌晨12点_java - JAVA如果我在每天中午12点之后安排我的时间表,会发生什么? - SO中文参考 - www.soinside.com...
  3. iview 表单提交之前验证是否符合条件
  4. JavaScript中的运算符
  5. Moblin MID开发学习笔记 - application launcher安装过程
  6. Oracle数据库ORA-12514错误的解决办法
  7. nginx php上传大小设置
  8. FastReport问题整理
  9. 《OpenCV3编程入门》毛星云编著
  10. 从软件工程师到有赞新零售技术负责人,34岁李星专访
  11. 维京小队3dm中文版|维京小队中文免安装版
  12. SAP CO T-Code.
  13. 什么是腾讯云主机安全,主要有哪些功能作用?
  14. css中repeat用法,CSS background-repeat用法及代码示例
  15. 面试复习归纳(技术服务、网络安全、运维与云计算)
  16. Odoo权限详解一张图
  17. wps word修改目录行间距后出现空行的现象,且删除按键无效
  18. 数据结构与算法(Python版)十五:无序表抽象数据类型及Python实现
  19. ant design vue 表头自定义筛选
  20. vnc远程桌面,六款好用又免费的vnc远程桌面软件

热门文章

  1. Redis:23---info命令总结
  2. vue process.env获取不到_从文档开始,重学vue(下)源码级别
  3. C++for_each| bind1st | ptr_fun | std::function的用法
  4. 计算机操作系统生产者和消费者模型的简单介绍
  5. Android Gradle 批量修改生成的apk文件名
  6. VS2008下最新X264(svn 2009.9)编译不过的解决办法
  7. 代码审查“思维导图”
  8. ffmpeg分析系列
  9. ROW_NUMBER() OVER() 函数用法详解 (分组排序,多例子)
  10. 解决:Cannot read property ‘component‘ of undefined ( 即 vue-router 0.x 转化为 2.x)