题意:给一个无向图(连通的),张在第n个点,吴在第1个点,‘吴’只能通过最短路才能到达‘张’,两个问题:(1)张最少毁掉多少条边后,吴不可到达张(2)吴在张毁掉最多多少条边后仍能到达张。

思路:注意是最短路才可达,但是最短路径可能有多条(即权值相等的)!!

  第二个问题好回答,来次最短路,记录下到达每个点在最低权值的情况下的最少次用边。

  第一个问题,同样只要砍掉最短路的某些边即可。要根据第2个问题所跑的SSSP,将不是最短路的边的剔除,重新建图,跑最大流,得到结果。

  当然要考虑重边!

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define pii pair<int,int>
  4. #define INF 0x7f7f7f7f
  5. using namespace std;
  6. const int N=;
  7. vector<int> vect[], vect2[];
  8. int g[][];
  9. struct node
  10. {
  11. int from,to,cap,flow;
  12. node(){};
  13. node(int from,int to,int cap,int flow):from(from),to(to),cap(cap),flow(flow){};
  14. }edge[N*];
  15. struct node2//跑最短路用的
  16. {
  17. int from,to,cost;
  18. node2(){};
  19. node2(int from,int to,int cost):from(from),to(to),cost(cost){};
  20. }oldedge[N*];
  21.  
  22. int edge_cnt,edge_cnt2, n, m;
  23. void add_node(int from,int to,int cap,int flow)
  24. {
  25. edge[edge_cnt]=node(from, to, cap, flow);
  26. vect[from].push_back(edge_cnt++);
  27. }
  28. void add_node2(int from,int to,int cost)//跑最短路用的
  29. {
  30. oldedge[edge_cnt2]=node2(from, to, cost);
  31. vect2[from].push_back(edge_cnt2++);
  32. }
  33.  
  34. int flow[], path[];
  35. int cost[], inq[], times[];
  36.  
  37. int BFS(int s,int e)
  38. {
  39. deque<int> que(,s);
  40. flow[s]=INF;
  41. while(!que.empty())
  42. {
  43. int x=que.front();
  44. que.pop_front();
  45. for(int i=; i<vect[x].size(); i++)
  46. {
  47. node e=edge[vect[x][i]];
  48. if(!flow[e.to] && e.cap>e.flow)
  49. {
  50. flow[e.to]=min(flow[e.from], e.cap-e.flow);
  51. path[e.to]=vect[x][i];
  52. que.push_back(e.to);
  53. }
  54. }
  55. if(flow[e]) return flow[e];
  56. }
  57. return flow[e];
  58. }
  59. int max_flow(int s,int e)
  60. {
  61. int ans_flow=;
  62. while(true)
  63. {
  64. memset(path,,sizeof(path));
  65. memset(flow,,sizeof(flow));
  66.  
  67. int tmp=BFS(s,e);
  68. if(!tmp) return ans_flow;
  69. ans_flow+=tmp;
  70.  
  71. int ed=e;
  72. while(ed!=s)
  73. {
  74. int t=path[ed];
  75. edge[t].flow+=tmp;
  76. edge[t^].flow-=tmp;
  77. ed=edge[t].from;
  78. }
  79. }
  80. }
  81.  
  82. int spfa(int s,int e)
  83. {
  84. memset(cost,0x7f,sizeof(cost));
  85. memset(inq,,sizeof(inq));
  86. memset(times,0x7f,sizeof(times));//记录到达每个点的最少用边,前提是权最少
  87.  
  88. deque<int> que(,s);
  89. cost[s]=;
  90. times[s]=;
  91. while(!que.empty())
  92. {
  93. int x=que.front();que.pop_front();
  94. inq[x]=;
  95. for(int i=; i<vect2[x].size(); i++)
  96. {
  97. node2 e=oldedge[vect2[x][i]];
  98. if(cost[e.to]>=cost[e.from]+e.cost)
  99. {
  100. if( cost[e.to]>cost[e.from]+e.cost) times[e.to]=times[e.from]+;
  101. else times[e.to]=min(times[e.to], times[e.from]+);
  102.  
  103. cost[e.to]=cost[e.from]+e.cost;
  104. if(!inq[e.to])
  105. {
  106. inq[e.to]=;
  107. que.push_back(e.to);
  108. }
  109. }
  110. }
  111. }
  112. return times[e];
  113. }
  114.  
  115. void build_graph()
  116. {
  117. for(int i=; i<=n; i++)
  118. {
  119. for(int j=; j<vect2[i].size(); j++)
  120. {
  121. node2 e=oldedge[vect2[i][j]];
  122. if(cost[e.to]==cost[e.from]+e.cost)
  123. {
  124. add_node(e.from,e.to,,);
  125. add_node(e.to,e.from,,);
  126. }
  127. }
  128. }
  129. }
  130.  
  131. int main()
  132. {
  133. freopen("input.txt", "r", stdin);
  134. int a, b, c;
  135. while(~scanf("%d%d", &n, &m))
  136. {
  137. edge_cnt=;
  138. edge_cnt2=;
  139. memset(edge,,sizeof(edge));
  140. memset(oldedge,,sizeof(oldedge));
  141. for(int i=n; i>=; i--) vect[i].clear(),vect2[i].clear();
  142.  
  143. for(int i=; i<m; i++)
  144. {
  145. scanf("%d %d %d", &a, &b, &c);
  146. add_node2(a,b,c);
  147. add_node2(b,a,c);
  148. }
  149. int ans2=spfa(,n);
  150. build_graph();//重新建图
  151. int ans1=max_flow(,n);
  152. printf("%d %d\n", ans1, m-ans2);
  153. }
  154. return ;
  155. }

AC代码

HDU 5294 Tricks Device (最短路,最大流)的更多相关文章

  1. HDU 5294 Tricks Device 最短路+最大流

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 题意: 给你个无向图: 1.求最少删除几条边就能破坏节点1到节点n的最短路径, 2.最多能删除 ...

  2. hdu 5294 Tricks Device 最短路建图+最小割

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...

  3. HDU 5294 Tricks Device (最大流+最短路)

    题目链接:HDU 5294 Tricks Device 题意:n个点,m条边.而且一个人从1走到n仅仅会走1到n的最短路径.问至少破坏几条边使原图的最短路不存在.最多破坏几条边使原图的最短路劲仍存在 ...

  4. HDU 5294 Tricks Device 网络流 最短路

    Tricks Device 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 Description Innocent Wu follows D ...

  5. HDOJ 5294 Tricks Device 最短路(记录路径)+最小割

    最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...

  6. HDU 5294 Tricks Device(多校2015 最大流+最短路啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Problem Description Innocent Wu follows Dumb Zha ...

  7. hdu 5294 Tricks Device(2015多校第一场第7题)最大流+最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294   题意:给你n个墓室,m条路径,一个人在1号墓室(起点),另一个人在n号墓室(终点),起点的那 ...

  8. SPFA+Dinic HDOJ 5294 Tricks Device

    题目传送门 /* 题意:一无向图,问至少要割掉几条边破坏最短路,问最多能割掉几条边还能保持最短路 SPFA+Dinic:SPFA求最短路时,用cnt[i]记录到i最少要几条边,第二个答案是m - cn ...

  9. Tricks Device (hdu 5294 最短路+最大流)

    Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

随机推荐

  1. jquery加入收藏代码

    <html> <head> <script type="text/javascript" src="jquery-1.9.1.js" ...

  2. Kruskal最小生成树

    并查集+kruskal==>MST 效率很低 #include <iostream> using namespace std; #define MAX 105 //自己设置最大值 / ...

  3. crontab 不能执行git命令问题备忘

    这问题够隐蔽,折腾了近两个小时. 命令 git checkout tagname 手工执行都正常 但在crontab运行时发现分支一直切不过去. 后来告诉是crontab默认的 path  设置和系统 ...

  4. Ubuntu环境下利用ant编译nutch2.2.1 & 配置nutch2.2.1

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  5. hdu 1517 A Multiplication Game 博弈论

    思路:求必胜区间和必败区间! 1-9 先手胜 10-2*9后手胜 19-2*9*9先手胜 163-2*2*9*9后手胜 …… 易知右区间按9,2交替出现的,所以每次除以18,直到小于18时就可以直接判 ...

  6. floodlight StaticFlowPusher 基于网段写flow,通配

    flow1 = { "switch":"00:00:00:00:00:00:00:03", "name":"flow-mod-1& ...

  7. *[codility]MissingInteger

    今天开始刷刷codility上respectable的题目,难度适中. https://codility.com/demo/take-sample-test/missing_integer 本题是找出 ...

  8. SpringMVC学习总结(二)——DispatcherServlet详解

    摘要: DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring ...

  9. 缓存初解(四)---Ibatis的缓存配置+Ehcache

    项目完结,整理一些技术方面的相关收获. 已经记不得EhCacheController这个实现类最早来自于那里了,总之稍加修改后非常有效果,大家就这么用了,感谢最初开源的那位兄弟.这里,主要是做个记录, ...

  10. java:I/O 字节流和字符流

    字节流 InputStream和OutputStream的子类:FileInputStream 和 FileOutputStream 方法: int read(byte[] b,int off,int ...