题目链接

让你判断最小割是否唯一。

判断方法是, 先求一遍最大流, 然后从源点dfs一次, 搜索未饱和边的数目。 从汇点dfs一次, 同样也是搜索未饱和边的数目, 看总和是否等于n。 如果等于n那么唯一。

具体可以看这里, http://www.cnblogs.com/Lyush/archive/2013/05/01/3053640.html

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define mem(a) memset(a, 0, sizeof(a))
  4. #define mem1(a) memset(a, -1, sizeof(a))
  5. const int inf = 1e8;
  6. const int maxn = 2e4+;
  7. int head[maxn*], s, t, num, q[maxn*], dis[], vis[], cnt;
  8. struct node
  9. {
  10. int to, nextt, c;
  11. }e[maxn*];
  12. void init() {
  13. mem1(head);
  14. num = cnt = ;
  15. mem(vis);
  16. }
  17. void add(int u, int v, int c) {
  18. e[num].to = v; e[num].nextt = head[u]; e[num].c = c; head[u] = num++;
  19. e[num].to = u; e[num].nextt = head[v]; e[num].c = c; head[v] = num++;
  20. }
  21. int bfs() {
  22. int u, v, st = , ed = ;
  23. mem(dis);
  24. dis[s] = ;
  25. q[ed++] = s;
  26. while(st<ed) {
  27. u = q[st++];
  28. for(int i = head[u]; ~i; i = e[i].nextt) {
  29. v = e[i].to;
  30. if(e[i].c&&!dis[v]) {
  31. dis[v] = dis[u]+;
  32. if(v == t)
  33. return ;
  34. q[ed++] = v;
  35. }
  36. }
  37. }
  38. return ;
  39. }
  40. int dfs(int u, int limit) {
  41. if(u == t)
  42. return limit;
  43. int cost = ;
  44. for(int i = head[u]; ~i; i = e[i].nextt) {
  45. int v = e[i].to;
  46. if(e[i].c&&dis[u] == dis[v]-) {
  47. int tmp = dfs(v, min(limit-cost, e[i].c));
  48. if(tmp>) {
  49. e[i].c -= tmp;
  50. e[i^].c += tmp;
  51. cost += tmp;
  52. if(cost == limit)
  53. break;
  54. } else {
  55. dis[v] = -;
  56. }
  57. }
  58. }
  59. return cost;
  60. }
  61. int dinic() {
  62. int ans = ;
  63. while(bfs()) {
  64. ans += dfs(s, inf);
  65. }
  66. return ans;
  67. }
  68. void dfs(int u) {
  69. vis[u] = ;
  70. cnt++;
  71. for(int i = head[u]; ~i; i = e[i].nextt) {
  72. int v = e[i].to;
  73. if(!vis[v]&&e[i].c) {
  74. dfs(v);
  75. }
  76. }
  77. }
  78. void dfs1(int u) {
  79. vis[u] = ;
  80. cnt++;
  81. for(int i = head[u]; ~i; i = e[i].nextt) {
  82. int v = e[i].to;
  83. if(!vis[v]&&e[i^].c) {
  84. dfs1(v);
  85. }
  86. }
  87. }
  88. int main()
  89. {
  90. int n, m, x, y, z;
  91. while(scanf("%d%d%d%d", &n, &m, &s, &t)) {
  92. if(n+m+s+t==)
  93. break;
  94. init();
  95. while(m--) {
  96. scanf("%d%d%d", &x, &y, &z);
  97. add(x, y, z);
  98. }
  99. int ans = dinic();
  100. dfs(s);
  101. dfs1(t);
  102. if(cnt == n) {
  103. cout<<"UNIQUE"<<endl;
  104. } else {
  105. cout<<"AMBIGUOUS"<<endl;
  106. }
  107. }
  108. }

zoj 2587 Unique Attack 最小割判定的更多相关文章

  1. ZOJ 2587 Unique Attack (最小割唯一性)

    题意 判断一个无向图的割是否唯一 思路 错误思路:一开始想的是判断割边是否都是关键割边,那既然割边两端点能连通S.T点的边是关键边,那么只要遇到有某个边两端点不连通S or T则这条边就不是关键割边( ...

  2. ZOJ 2587 Unique Attack(最小割唯一性判断)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2587 题意:判断最小割是否唯一. 思路: 最小割唯一性的判断是先跑一遍最大 ...

  3. ZOJ - 2587 Unique Attack (判断最小割是否唯一)

    题意:判断最小割是否唯一. 分析:跑出最大流后,在残余网上从源点和汇点分别dfs一次,对访问的点都打上标记. 若还有点没有被访问到,说明最小割不唯一. https://www.cnblogs.com/ ...

  4. zoj 2587 Unique Attack【最小割】

    拆点拆魔怔了 直接按照原图建就行,这里有个小技巧就是双向边的话不用按着板子建(u,v,c)(v,u,0)(v,u,c)(u,v,0),直接建(u,v,c)(v,u,c)会快十倍!800ms->8 ...

  5. ZOJ-2587-Unique Attack(最小割的唯一性)

    题意: 求无向图最小割是否唯一 分析: 1.我们先对原图求一次最大流 2.对残留网络,我们从S开始,找到所有所有S能到达的点:再从T开始,找出所有能到达T的点. 3.判断原网络中是否还有没有访问到的点 ...

  6. ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)

    [题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...

  7. ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)

    求最小割及最小花费 把边权c = c*10000+1 然后跑一个最小割,则flow / 10000就是费用 flow%10000就是边数. 且是边数最少的情况.. #include<stdio. ...

  8. zoj 2532 Internship【最小割】

    就是求哪些边在最大流上满流,也就是找割边.把0作为t点,s向所有的1~n连流量为inf的边,其他的边按照流量连.跑一遍最大流,从s顺着有残余流量的正向边dfs打标记fr,从t顺着正向边有残余流量的反向 ...

  9. [ZOJ2587]Unique Attack

    vjudge sol 最小割判定唯一性. 只要做完一个任意最小割后,判断一下是不是所有点都要么和\(S\)相连,要么和\(T\)相连. 只要两边各一次\(dfs\)就行了. code #include ...

随机推荐

  1. 兼容所有浏览器的CSS3圆角

    兼容所有浏览器的CSS3圆角      解决CSS3圆角兼容所有浏览器的方法.本文提到了一种很不错的实现跨浏览器圆角的解决方案,但是说的不够全面,前端观察最近将整理更多更全面的资源给大家,敬请期待. ...

  2. EBS R12 怎么修改APPS密码

    apps 和 applsys 的口令 $> FNDCPASS apps/<apps password> 0 Y system/<system password> SYST ...

  3. ios 中的构造方法

    构造方法 1.什么是构造方法? 初始化对象的方法. 默认情况下,在 OC 当中创建1个对象分为两部分(new 做的事): +alloc:分配内存空间 -init :初始化对象 2.构造方法的作用是? ...

  4. JVM学习之强引用、弱引用、软引用、虚引用

    转自:http://my.oschina.net/ydsakyclguozi/blog/404389 多谢博主分享 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象 ...

  5. mysql建立数据库的方法

    mysql建立数据库的方法 方法一:使用create mysql> create database roudy; Query OK, 1 row affected (0.00 sec) mysq ...

  6. Android Shape画圆,矩形

    画圆环代码如下: 画圆环,外边的边界宽度大一点即可: <?xml version="1.0" encoding="utf-8"?> <shap ...

  7. Python中进行Base64编码和解码

    Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...

  8. EditText无法失去焦点、失去焦点隐藏软键盘

    很奇怪,我在给EditText设置setOnFocusChangeListener()监听,但是始终未能成功,焦点一直存在,不知其原因,,代码如下: et_username.setOnFocusCha ...

  9. DMVsinSQLServer -- 备

    /*************************************************************************************************** ...

  10. 转 批处理 %~dp0的意义

    http://nealcai.iteye.com/blog/1685192 http://blog.csdn.net/caz28/article/details/7448677 http://stac ...