题意:

求无向图最小割是否唯一

分析:

1、我们先对原图求一次最大流

2、对残留网络,我们从S开始,找到所有所有S能到达的点;再从T开始,找出所有能到达T的点。

3、判断原网络中是否还有没有访问到的点,如果没有,则唯一,否者,不唯一!

  1. // File Name: ACM/ZOJ/2587.cpp
  2. // Author: Zlbing
  3. // Created Time: 2013年08月16日 星期五 13时38分56秒
  4.  
  5. #include<iostream>
  6. #include<string>
  7. #include<algorithm>
  8. #include<cstdlib>
  9. #include<cstdio>
  10. #include<set>
  11. #include<map>
  12. #include<vector>
  13. #include<cstring>
  14. #include<stack>
  15. #include<cmath>
  16. #include<queue>
  17. using namespace std;
  18. #define CL(x,v); memset(x,v,sizeof(x));
  19. #define INF 0x3f3f3f3f
  20. #define LL long long
  21. #define REP(i,r,n) for(int i=r;i<=n;i++)
  22. #define RREP(i,n,r) for(int i=n;i>=r;i--)
  23. const int MAXN=;
  24. struct Edge{
  25. int from,to,cap,flow;
  26. };
  27. bool cmp(const Edge& a,const Edge& b){
  28. return a.from < b.from || (a.from == b.from && a.to < b.to);
  29. }
  30. struct Dinic{
  31. int n,m,s,t;
  32. vector<Edge> edges;
  33. vector<int> G[MAXN];
  34. bool vis[MAXN];
  35. int d[MAXN];
  36. int cur[MAXN];
  37. void init(int n){
  38. this->n=n;
  39. for(int i=;i<=n;i++)G[i].clear();
  40. edges.clear();
  41. }
  42. void AddEdge(int from,int to,int cap){
  43. edges.push_back((Edge){from,to,cap,});
  44. edges.push_back((Edge){to,from,cap,});//当是无向图时,反向边容量也是cap,有向边时,反向边容量是0
  45. m=edges.size();
  46. G[from].push_back(m-);
  47. G[to].push_back(m-);
  48. }
  49. bool BFS(){
  50. CL(vis,);
  51. queue<int> Q;
  52. Q.push(s);
  53. d[s]=;
  54. vis[s]=;
  55. while(!Q.empty()){
  56. int x=Q.front();
  57. Q.pop();
  58. for(int i=;i<G[x].size();i++){
  59. Edge& e=edges[G[x][i]];
  60. if(!vis[e.to]&&e.cap>e.flow){
  61. vis[e.to]=;
  62. d[e.to]=d[x]+;
  63. Q.push(e.to);
  64. }
  65. }
  66. }
  67. return vis[t];
  68. }
  69. int DFS(int x,int a){
  70. if(x==t||a==)return a;
  71. int flow=,f;
  72. for(int& i=cur[x];i<G[x].size();i++){
  73. Edge& e=edges[G[x][i]];
  74. if(d[x]+==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>){
  75. e.flow+=f;
  76. edges[G[x][i]^].flow-=f;
  77. flow+=f;
  78. a-=f;
  79. if(a==)break;
  80. }
  81. }
  82. return flow;
  83. }
  84. //当所求流量大于need时就退出,降低时间
  85. int Maxflow(int s,int t,int need){
  86. this->s=s;this->t=t;
  87. int flow=;
  88. while(BFS()){
  89. CL(cur,);
  90. flow+=DFS(s,INF);
  91. if(flow>need)return flow;
  92. }
  93. return flow;
  94. }
  95. //最小割割边
  96. vector<int> Mincut(){
  97. BFS();
  98. vector<int> ans;
  99. for(int i=;i<edges.size();i++){
  100. Edge& e=edges[i];
  101. if(vis[e.from]&&!vis[e.to]&&e.cap>)ans.push_back(i);
  102. }
  103. return ans;
  104. }
  105. void Reduce(){
  106. for(int i = ; i < edges.size(); i++) edges[i].cap -= edges[i].flow;
  107. }
  108. void ClearFlow(){
  109. for(int i = ; i < edges.size(); i++) edges[i].flow = ;
  110. }
  111. void dfs1(int u)
  112. {
  113. vis_dfs[u]=;
  114. a++;
  115. for(int i=;i<(int)G[u].size();i++)
  116. {
  117. Edge e=edges[G[u][i]];
  118. if(e.cap>e.flow&&!vis_dfs[e.to])
  119. dfs1(e.to);
  120. }
  121. }
  122. void dfs2(int u)
  123. {
  124. vis_dfs[u]=;
  125. b++;
  126. for(int i=;i<(int)G[u].size();i++)
  127. {
  128. Edge e=edges[G[u][i]^];
  129. if(e.cap>e.flow&&!vis_dfs[e.from])
  130. dfs2(e.from);
  131. }
  132. }
  133. bool solve()
  134. {
  135. CL(vis_dfs,);
  136. a=;
  137. b=;
  138. dfs1(s);
  139. dfs2(t);
  140. if(a+b==n)return true;
  141. else return false;
  142. }
  143. int a,b;
  144. int vis_dfs[MAXN];
  145. };
  146. Dinic solver;
  147. int main()
  148. {
  149. int n,m,A,B;
  150. while(~scanf("%d%d%d%d",&n,&m,&A,&B))
  151. {
  152. if(n==)break;
  153. solver.init(n);
  154. int a,b,c;
  155. REP(i,,m)
  156. {
  157. scanf("%d%d%d",&a,&b,&c);
  158. solver.AddEdge(a,b,c);
  159. }
  160. solver.Maxflow(A,B,INF);
  161. bool ans=solver.solve();
  162. if(ans)puts("UNIQUE");
  163. else puts("AMBIGUOUS");
  164. }
  165. return ;
  166. }

ZOJ-2587-Unique Attack(最小割的唯一性)的更多相关文章

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

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

  2. zoj 2587 Unique Attack 最小割判定

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

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

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

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

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

  5. zoj 2587 Unique Attack【最小割】

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

  6. zoj 2587 判断最小割的唯一性

    算法: 先求出残量网络,计算出从src能够到的点集A,再求出能够到dst的点集B,如果所有点都被访问到了,那么割就是唯一的,即(A,B),否则(A,V-A)和(V-B,B)都是最小割. (注意因为割的 ...

  7. BZOJ 1797 最小割(最小割割边唯一性判定)

    问题一:是否存在一个最小代价路径切断方案,其中该道路被切断? 问题二:是否对任何一个最小代价路径切断方案,都有该道路被切断? 现在请你回答这两个问题. 最小割唯一性判定 jcvb: 在残余网络上跑ta ...

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

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

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

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

随机推荐

  1. [iOS 开发] app无法访问本地相册,且不显示在设置 -隐私 - 照片中

    近几天在使用iOS8的Photos Framework访问本地相册时,app即不会弹出是否允许访问提示框,也无法显示在iPhone的设置-隐私-照片的访问列表中,代码如下: PHAuthorizati ...

  2. Android开发报错系列(一),java.lang.NullPointerException,at android.widget.ListView.setupChild

    问题描述:运行代码是报空指针错误,java.lang.NullPointerException,at Android.widget.ListView.setupChild 问题定位:listview控 ...

  3. Python之路【第十四篇】:AngularJS --暂无内容-待更新

    Python之路[第十四篇]:AngularJS --暂无内容-待更新

  4. maven 依赖冲突的问题

    如果原始系统的jarA依赖jarB1.0 而新引入的jarC依赖jarB2.0 导致系统启动报错,提示冲突,这时为了保证原始系统的稳定性, 在pom.xml文件中引入jarC时,需要exclude掉j ...

  5. apache commons io包基本功能

    1. http://jackyrong.iteye.com/blog/2153812 2. http://www.javacodegeeks.com/2014/10/apache-commons-io ...

  6. openURL的使用方法

    openURL的使用方法 openURL的使用方法: view plaincopy to clipboardprint? [[UIApplication sharedApplication] open ...

  7. UITableViewCell 添加长按手势

    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self actio ...

  8. .net版ckeditor配置水印功能(转)

    本文简单讲解ckfinder控件给上图片加水印效果. 1.将ckfinder/plugins/watermark/bin/Debug目录下的CKFinder_Watermark.dll和CKFinde ...

  9. C# 多线程、结构体

    struct IpAndPort { public string Ip; public int Port; } private void Form1_Load(object sender, Event ...

  10. jQuery实现公告文字左右滚动的代码。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...