给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到0)

正反向建图,分别求出起点到每个点的最短距离,终点到每个点的最短距离(用这个可以算出减小的边权)

再将在最短路径上的边重新建图。求出里面的桥,就是必须经过的边

wa了一上午------呜呜呜呜

先wa 19  是因为求桥的时候是无向图,数组开小了一半

然后 wa 46 ,是因为dis[]数组初始化为 1 << 30 -1 ,应该再开大点 ,开成 1 << 50 -1

我写成 1 LL * 50 -----一直wa 19------

5555555555555555555--------sad-------

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <vector>
  6. #include <map>
  7. #include <set>
  8. #include <stack>
  9. #include <queue>
  10. #include <iostream>
  11. #include <algorithm>
  12. using namespace std;
  13. #define lp (p << 1)
  14. #define rp (p << 1|1)
  15. #define getmid(l,r) (l + (r - l) / 2)
  16. #define MP(a,b) make_pair(a,b)
  17. typedef long long ll;
  18. typedef unsigned long long ull;
  19. typedef pair<int,int> pii;
  20. const int INF = ( << ) - ;
  21. const int maxn = ;
  22.  
  23. int N,M;
  24. ll path;
  25. int first1[maxn],nxt1[ * maxn],ecnt1;
  26. int first2[maxn],nxt2[ *maxn],ecnt2;
  27. int first[maxn],nxt[*maxn],ecnt;
  28. ll dis1[maxn],dis2[maxn];
  29.  
  30. int bg[*maxn],vis[*maxn],low[maxn],dfn[maxn];
  31. int ans[*maxn],res[maxn];
  32. int tot,num;
  33.  
  34. struct edge{
  35. int v,u,cost;
  36. int tag;
  37. int ge;
  38. int id;
  39. friend bool operator < (edge a,edge b){
  40. return a.cost > b.cost;
  41. }
  42. };
  43.  
  44. edge e1[*maxn],e2[*maxn],e[*maxn];
  45.  
  46. void init(){
  47. ecnt1 = ecnt2 = ecnt = ;
  48. memset(first1,-,sizeof(first1));
  49. memset(first2,-,sizeof(first2));
  50. memset(first,-,sizeof(first));
  51. }
  52.  
  53. void Add_edge1(int u,int v,int c){
  54. nxt1[++ecnt1] = first1[u];
  55. e1[ecnt1].u = u;
  56. e1[ecnt1].v = v;
  57. e1[ecnt1].cost = c;
  58. e1[ecnt1].tag = ;
  59. e1[ecnt1].ge = ;
  60. first1[u] = ecnt1;
  61. }
  62.  
  63. void Add_edge2(int u,int v,int c){
  64. nxt2[++ecnt2] = first2[u];
  65. e2[ecnt2].v = v;
  66. e2[ecnt2].cost = c;
  67. e2[ecnt2].tag = ;
  68. e2[ecnt2].ge = ;
  69. first2[u] = ecnt2;
  70. }
  71.  
  72. void Add_edge(int u,int v,int c){
  73. nxt[ecnt] = first[u];
  74. e[ecnt].v = v;
  75. e[ecnt].u = u;
  76. e[ecnt].id = c;
  77. first[u] = ecnt++;
  78.  
  79. nxt[ecnt] = first[v];
  80. e[ecnt].v = u;
  81. e[ecnt].u = v;
  82. e[ecnt].id = c;
  83. first[v] = ecnt++;
  84. }
  85.  
  86. struct cmp{
  87. bool operator ()(pii a,pii b){
  88. return a.first > b.first;
  89. }
  90. };
  91.  
  92. void Dijstra1(int s){
  93. priority_queue<pii,vector<pii >,cmp> PQ;
  94. dis1[s] = ;
  95. PQ.push(MP(dis1[s],s));
  96. int cnt = ;
  97. while(!PQ.empty()){
  98. pii x = PQ.top(); PQ.pop();
  99. if(dis1[x.second] < x.first) continue;
  100. for(int i = first1[x.second]; i != -; i = nxt1[i]){
  101. int v = e1[i].v;
  102. if(dis1[v] > dis1[x.second] + e1[i].cost){
  103. dis1[v] = dis1[x.second] + e1[i].cost;
  104. PQ.push(MP(dis1[v],v));
  105. }
  106. }
  107. }
  108. }
  109.  
  110. void Dijstra2(int s){
  111. priority_queue<pii,vector<pii >,cmp> PQ;
  112. dis2[s] = ;
  113. PQ.push(MP(dis2[s],s));
  114. int cnt = ;
  115. while(!PQ.empty()){
  116. pii x = PQ.top(); PQ.pop();
  117. if(dis2[x.second] < x.first) continue;
  118. for(int i = first2[x.second]; i != -; i = nxt2[i]){
  119. int v = e2[i].v;
  120. if(dis2[v] > dis2[x.second] + e2[i].cost){
  121. dis2[v] = dis2[x.second] + e2[i].cost;
  122. PQ.push(MP(dis2[v],v));
  123. }
  124. }
  125. }
  126. }
  127.  
  128. void Dfs(int p,int pre){
  129. dfn[p] = low[p] = ++tot;
  130. for(int i = first[p]; ~i; i = nxt[i]){
  131. int v = e[i].v;
  132. if(vis[i]) continue;
  133. vis[i] = vis[i ^ ] = true;
  134. if(!dfn[v]){
  135. Dfs(v,p);
  136. low[p] = min(low[p],low[v]);
  137. if(low[v] > dfn[p]) {
  138. bg[i] = bg[i ^ ] = true;
  139. ans[e[i].id] = ;
  140. }
  141. }
  142. else low[p] = min(low[p],dfn[v]);
  143. }
  144. }
  145.  
  146. void Tarjan(){
  147. memset(dfn,,sizeof(dfn));
  148. memset(low,,sizeof(low));
  149. memset(bg,false,sizeof(bg));
  150. memset(vis,false,sizeof(vis));
  151. tot = ;
  152. for(int i = ; i <= N; ++i) if( dfn[i] == ) Dfs(i,-);
  153. }
  154.  
  155. void solve(){
  156. memset(res,-,sizeof(res));
  157. for(int i = ;i <= M;i++){
  158. int u = e1[i].u;
  159. int v = e1[i].v;
  160. if(ans[i] == ) {
  161. res[i] = ;
  162. continue;
  163. }
  164. ll need = path - dis1[u] - dis2[v];
  165. if(need > ){
  166. res[i] = e1[i].cost - need + ;
  167. }
  168. }
  169.  
  170. for(int i = ;i <= M;i++){
  171. if(res[i] == ) puts("YES");
  172. else if(res[i] == -) puts("NO");
  173. else printf("CAN %d\n",res[i]);
  174. }
  175. }
  176.  
  177. int main(){
  178. int a,b,c,s,t;
  179. num = ;
  180. while(scanf("%d%d%d%d",&N,&M,&s,&t) != EOF){
  181. num++;
  182. init();
  183. int x;
  184.  
  185. for(int i = ; i <= M; ++i){
  186. scanf("%d%d%d",&a,&b,&c);
  187. Add_edge1(a,b,c);
  188. Add_edge2(b,a,c);
  189. }
  190.  
  191. for(int i = ;i <= N;i++) dis1[i] = dis2[i] = 1ll << ;
  192.  
  193. Dijstra1(s);
  194. Dijstra2(t);
  195. path = dis1[t];
  196.  
  197. for(int u = ;u <= N;u++){
  198. for(int i = first1[u];~i;i = nxt1[i]){
  199. int v = e1[i].v;
  200. if(dis1[u] + dis2[v] + e1[i].cost == path) {
  201. e1[i].tag = ;
  202. e2[i].tag = ;
  203. Add_edge(u,v,i);
  204. }
  205. }
  206. }
  207.  
  208. memset(ans,,sizeof(ans));
  209. Tarjan();
  210. solve();
  211. }
  212. return ;
  213. }

codeforces 567 E. President and Roads 【 最短路 桥 】的更多相关文章

  1. Codeforces Round #Pi (Div. 2) E. President and Roads 最短路+桥

    题目链接: http://codeforces.com/contest/567/problem/E 题意: 给你一个带重边的图,求三类边: 在最短路构成的DAG图中,哪些边是必须经过的: 其他的(包括 ...

  2. 【CodeForces 567E】President and Roads(最短路)

    Description Berland has n cities, the capital is located in city s, and the historic home town of th ...

  3. Codeforces.567E.President and Roads(最短路 Dijkstra)

    题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...

  4. cf567E. President and Roads(最短路计数)

    题意 题目链接 给出一张有向图,以及起点终点,判断每条边的状态: 是否一定在最短路上,是的话输出'YES' 如果不在最短路上,最少减去多少权值会使其在最短路上,如果减去后的权值\(< 1\),输 ...

  5. Codeforces Round #Pi (Div. 2) E. President and Roads tarjan+最短路

    E. President and RoadsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/567 ...

  6. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  7. Codeforces Round #302 (Div. 2) D. Destroying Roads 最短路

    题目链接: 题目 D. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input ...

  8. Codeforces Gym 100338C Important Roads 最短路+Tarjan找桥

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  9. Codeforces 543B Destroying Roads(最短路)

    题意: 给定一个n个点(n<=3000)所有边长为1的图,求最多可以删掉多少条边后,图满足s1到t1的距离小于l1,s2到t2的距离小于l2. Solution: 首先可以分两种情况讨论: 1: ...

随机推荐

  1. [IOI2011]Race $O(nlog^{2}n)$ 做法

    这个应该还不是正解,明天看一下正解到底是什么... Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in&qu ...

  2. AppScan用来进行漏洞扫描

    https://www.cnblogs.com/mawenqiangios/p/8573525.html

  3. ASP组件AspJpeg(加水印)生成缩略图等使用方法

    ASP组件AspJpeg(加水印)生成缩略图等使用方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-12-17我要评论 ASPJPEG是一款功能相当强大的图象处理组件,用它可以轻松地做出 ...

  4. IOS - xib(Interface Builder,view) - can't change view size(view不能改变大小问题)

    很多时候,我们自定义tableview.collectionview的cell,也有时候我们要自定义窗口xib,但创建xib后,其height.width不可修改. 这时问题就来了,怎么才能使我们的自 ...

  5. 简单JavaScript小程序

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  6. 用Python图像处理

    前几天弄了下django的图片上传,上传之后还需要做些简单的处理,python中PIL模块就是专门用来做这个事情的. 于是照葫芦画瓢做了几个常用图片操作,在这里记录下,以便备用. 这里有个字体文件,大 ...

  7. nodejs-NPM基本使用

    搜索模块 npm search express 更新模块 npm update express 卸载模块 npm uninstall express 安装模块 npm install express ...

  8. jdk环境变量设置理解

    1.系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) 2.系统变量→寻找 Path 变量→编辑 在变量值最后输入 %JAVA_HOM ...

  9. 关于心理的二十五种倾向(查理&#183;芒格)-2

    5)避免不一致倾向避免不一致倾向实际上就是人天生就害怕改变.相同是由于人类大脑的生理机制决定的.由于这样的倾向能够带来节省运算空间和能量的优点.这样的抗改变模式的形成,可能的原因例如以下:A) 迅速作 ...

  10. 16进制颜色字符串转为UIColor

    //16进制颜色(html颜色值)字符串转为UIColor +(UIColor *) hexStringToColor: (NSString *) stringToConvert {      NSS ...