题目

题意:

编写一个程序,给定一个网络规范和破坏每个连接的成本,确定要切断哪个连接,以便将首都和最大的城市分离到尽可能低的成本。

分割-----------------------------------------

  1. 这道题的意思要把一个图分成两部分,要把点1和点2分开。隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边。
    这题很明显是最小割,也就是最大流。把1当成源点,2当成汇点。
    问题是要求最小割应该隔断那条边。

输入:

输入文件包含几组输入。每一组的描述如下。每个集合的第一行有两个整数,用空格隔开:第一个是网络中的城市数量n,最多为50。第二个是连接的总数,m,最多500。以下m行指定连接。每条线由三部分组成,中间用空格隔开:前两部分是由这两部分连接起来的城市(数字在1 - n范围内)。然后是切断连接的成本(范围为1到40000000的整数)。在这个列表中,每对引用最多只能出现一次。当n和m的值为0时,输入终止。这种情况不应该处理。对于每个输入集,首都是第1个城市,最大的城市是第2个城市。

输出:

对于每个输入集,您应该生成几行输出。每个输入集的输出描述如下:每个输入集的输出应该是城市对(即数字),它们之间的连接应该被切断(以任何顺序),每对在一行,数字之间用空格隔开。如果有多个解决方案,任何一个都可以。在每个输入集的输出之后打印空行。

题解:

  1. 1 void addedge(int u, int v, int w) //建双向边
  2. 2 { //u为起点,v为终点,w为边上的流量
  3. 3 edge[tot].v = v;
  4. 4 edge[tot].w = w;
  5. 5 edge[tot].next = head[u];
  6. 6 head[u] = tot++;
  7. 7
  8. 8 edge[tot].v = u;
  9. 9 edge[tot].w = w;
  10. 10 edge[tot].next = head[v];
  11. 11 head[v] = tot++;
  12. 12 return;
  13. 13 }

我之前就有一个疑问就是,为什么在建有向边的时候还要建一条容量为0的反向边。

其实这就是为了反悔之前的操作,因为我们第一次跑最大流的时候肯定会有好多路都可以跑到终点。但是我们最后要的是最大流,这就要考虑到最优策略,所以我们之前走过的路可能要改变。这个时候建立反向边的作用就体现了

代码:

  1. //本题是可以双向走,那么我们正向也可以反向也可以,所以我们在建反向边的时候就不能给它初始值为0,因为
  2. //他刚开始反向边就可以走
  3.  
  4. //在最后一次bfs之后,肯定就会出现断层(即,到不了终点),这个时候因为中间出现了流量为0所以到不了,
  5. //那么这些流量为0就是我们删去的边
  6. #include<stdio.h>
  7. #include<string.h>
  8. #include<iostream>
  9. #include<algorithm>
  10. #include<queue>
  11. using namespace std;
  12. const int maxn=10005;
  13. const int INF=0x3f3f3f3f;
  14. int head[maxn],cnt,st,en,dis[maxn],cur[maxn],xx[maxn],yy[maxn];
  15. struct edge
  16. {
  17. int v,next,c,flow;
  18. } e[100005];
  19. void add_edge(int x,int y,int z)
  20. {
  21. e[cnt].v=y;
  22. e[cnt].c=z;
  23. e[cnt].flow=0;
  24. e[cnt].next=head[x];
  25. head[x]=cnt++;
  26. }
  27. bool bfs()
  28. {
  29. memset(dis,0,sizeof(dis));
  30. dis[st]=1;
  31. queue<int>r;
  32. r.push(st);
  33. while(!r.empty())
  34. {
  35. int x=r.front();
  36. r.pop();
  37. for(int i=head[x];i!=-1;i=e[i].next)
  38. {
  39. int v=e[i].v;
  40. if(!dis[v] && e[i].c>e[i].flow)
  41. {
  42. dis[v]=dis[x]+1;
  43. r.push(v);
  44. }
  45. }
  46. }
  47. return dis[en];
  48. }
  49. int dinic(int s,int limit)
  50. {
  51. if(s==en || !limit) return limit;
  52. int ans=0;
  53. for(int &i=cur[s];i!=-1;i=e[i].next)
  54. {
  55. int v=e[i].v,feed;
  56. if(dis[v]!=dis[s]+1) continue;
  57. feed=dinic(v,min(limit,e[i].c-e[i].flow));
  58. if(feed)
  59. {
  60. e[i].flow+=feed;
  61. e[i^1].flow-=feed;
  62. limit-=feed;
  63. ans+=feed;
  64. if(limit==0) break;
  65. }
  66. }
  67. if(!ans) dis[s]=-1;
  68. return ans;
  69. }
  70. int main()
  71. {
  72. int s,d,n,m;
  73. while(~scanf("%d%d",&n,&m) && n+m)
  74. {
  75. memset(head,-1,sizeof(head));
  76. cnt=0;
  77. st=1;
  78. en=2;
  79. int x,y,z;
  80. for(int i=1;i<=m;++i)
  81. {
  82. scanf("%d%d%d",&x,&y,&z);
  83. xx[i]=x;
  84. yy[i]=y;
  85. add_edge(x,y,z);
  86. add_edge(y,x,z);
  87. }
  88.  
  89. int ans=0;
  90. while(bfs())
  91. {
  92. for(int i=0; i<=n; i++)
  93. cur[i]=head[i];
  94. ans+=dinic(st,INF);
  95. }
  96. for(int i=1;i<=m;++i)
  97. {
  98. if((!dis[xx[i]] && dis[yy[i]]) || (dis[xx[i]] && !dis[yy[i]]))
  99. {
  100. printf("%d %d\n",xx[i],yy[i]);
  101. }
  102. }
  103. printf("\n");
  104. }
  105. return 0;
  106. }

UVA 10480 Sabotage (最大流) 最小割边的更多相关文章

  1. Uva 10480 Sabotage 最大流

    表示自从学了网络流,就基本上是一直用dinic 这个题一看就是用最大流,作为常识,两个点之间的最大流等于最小割 但是这个题需要输出割边,然后我就不会了,dinic判流量我觉得也可做,但是一直wa 然后 ...

  2. UVA 10480 Sabotage (网络流,最大流,最小割)

    UVA 10480 Sabotage (网络流,最大流,最小割) Description The regime of a small but wealthy dictatorship has been ...

  3. UVA - 10480 Sabotage 最小割,输出割法

    UVA - 10480 Sabotage 题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路. 题解: ...

  4. UVA - 10480 Sabotage【最小割最大流定理】

    题意: 把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边.这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点,问题是要求最小割应该隔断那条边. ...

  5. J - Sabotage - UVA 10480(最大流)

    题目大意:旧政府有一个很庞大的网络系统,可以很方便的指挥他的城市,起义军为了减少伤亡所以决定破坏他们的网络,使他们的首都(1号城市)和最大的城市(2号城市)不能联系,不过破坏不同的网络所花费的代价是不 ...

  6. UVA - 10480 Sabotage (Dinic)

    The regime of a small but wealthy dictatorship has been abruptly overthrown by an unexpected rebel-l ...

  7. UVA 10480 Sabotage (最大流最小割)

    题目链接:点击打开链接 题意:把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边. 这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点. 问题是 ...

  8. UVA 10480 Sabotage

    最小割+输出方案 #include<cstdio> #include<cstring> #include<string> #include<cmath> ...

  9. 最大流&最小割 - 专题练习

    [例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...

随机推荐

  1. Java开发手册之工程结构

    1.在线上生产环境,JVM 的 Xms 和 Xmx 设置一样大小的内存容量,避免在 GC 后调整堆大小带来的压力. 2.给 JVM 环境参数设置-XX:+HeapDumpOnOutOfMemoryEr ...

  2. Upload - Labs (上)

    Pass - 01: 1.尝试上传一个php文件:aaa.php,发现只允许上传某些图片类型,用bp抓包,发现http请求都没通过burp就弹出了不允许上传的提示框,这表明验证点在前端,而不在服务端 ...

  3. C++:I/O流的概念和流类库的结构

    一.C++输入输出包含以下三个方面的内容: 对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到显示器屏幕.这种输入输出称为标准的输入输出,简称标准I/O. 以外存磁盘文件为对象进行输入和输出, ...

  4. 3A限流IC,带短路保护,PW1503和PW1502

    一般说明 PW1503,PW1502是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路保护.它具有超温保护以及反向闭锁功能. PW1503,PW1502采用薄型(1毫米)5针薄 ...

  5. JavaScript小记

    JavaScript小记 1. 简介 1. 语言描述 JavaScript 是一门跨平台.面向对象的弱类型动态脚本编程语言 JavaScript 是一门基于原型.函数先行的语言 JavaScript ...

  6. win 10下Apache和PHP的安装配置

    一.下载Apache 官网下载:https://httpd.apache.org/ 或者百度网盘链接:https://pan.baidu.com/s/17zVFNSfzzwDgFti_fboUSA 提 ...

  7. ajax异步实现文件分片上传

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Docker数据目录迁移解决方案

    场景 在docker的使用中随着下载镜像越来越多,构建镜像.运行容器越来越多, 数据目录必然会逐渐增大:当所有docker镜像.容器对磁盘的使用达到上限时,就需要对数据目录进行迁移. 如何避免: 1. ...

  9. 开心!再也不用担心 IntelliJ IDEA 试用过期了

    背景 前段时间 Review 团队小伙伴代码,发现当他把鼠标挪到一个方法上时,就自动显示了该方法的所有注释信息,像下图这样,他和我用的 IDE 都是 IntelliJ IDEA. 而我还按古老的方式, ...

  10. OAuth2.0是干什么的?

    OAuth2.0是干什么的? 首先用户有一些数据: 将数据存储在服务器上: 这时候有一个应用要访问数据: 如果这个应用是一个恶意程序呢?所以需要一个检验来判断请求是不是安全的: 如何判断是不是安全的? ...