http://codeforces.com/contest/716/problem/D

题目大意:给你一些边,有权值,权值为0的表示目前该边不存在,但是可以把0修改成另外一个权值。现在,我们重新建路,问让s-t的最短路能否刚好是L?

思路:暴力修改即可。。。

  1. //看看会不会爆int!数组会不会少了一维!
  2. //取物问题一定要小心先手胜利的条件
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. #define LL long long
  6. #define ALL(a) a.begin(), a.end()
  7. #define pb push_back
  8. #define mk make_pair
  9. #define fi first
  10. #define se second
  11. #define haha printf("haha\n")
  12. const int maxn = + ;
  13. const LL inf = 1e17;
  14. struct Edge{
  15. int from, to; LL val;
  16. Edge(int u = , int v = , LL val = ): from(u), to(v), val(val){}
  17. };
  18. vector<Edge> G[maxn];
  19. vector<Edge> zero;
  20. vector<Edge> realroad;
  21. int n, m, s, t;
  22. LL L;
  23. LL d[maxn];
  24.  
  25. void dijstra(int s){
  26. queue<int> que;
  27. for (int i = ; i < n; i++) d[i] = inf;
  28. que.push(s);
  29. d[s] = ;
  30. while (!que.empty()){
  31. int u = que.front(); que.pop();
  32. int len = G[u].size();
  33. for (int i = ; i < len; i++){
  34. Edge &e = G[u][i];
  35. if (d[e.to] > d[u] + e.val){
  36. d[e.to] = d[u] + e.val;
  37. que.push(e.to);
  38. }
  39. }
  40. }
  41. }
  42.  
  43. int main(){
  44. cin >> n >> m >> L >> s >> t;
  45. for (int i = ; i < m; i++){
  46. int u, v; LL val; scanf("%d%d%I64d", &u, &v, &val);
  47. if (val != ) {
  48. G[u].push_back(Edge(u, v, val)), G[v].push_back(Edge(v, u, val));
  49. realroad.push_back(Edge(u, v, val));
  50. }
  51. else if (val == ) zero.push_back(Edge(u, v, val));
  52. }
  53. dijstra(s);
  54. ///printf("d[t] = %I64d\n", d[t]);
  55. if (d[t] < L) {
  56. printf("NO\n"); return ;
  57. }
  58. else if (d[t] == L){
  59. printf("YES\n");
  60. for (int i = ; i < realroad.size(); i++){
  61. printf("%d %d %I64d\n", realroad[i].from, realroad[i].to, realroad[i].val);
  62. }
  63. for (int i = ; i < zero.size(); i++){
  64. printf("%d %d %I64d\n", zero[i].from, zero[i].to, inf);
  65. }
  66. return ;
  67. }
  68.  
  69. for (int i = ; i < zero.size(); i++){
  70. Edge &e = zero[i];
  71. G[e.from].push_back(Edge(e.from, e.to, ));
  72. G[e.to].push_back(Edge(e.to, e.from, ));
  73. e.val = ;
  74. dijstra(s);
  75. if (d[t] <= L){
  76. e.val = L - d[t] + ;
  77. break;
  78. }
  79. }
  80. if (d[t] > L) printf("NO\n");
  81. else {
  82. printf("YES\n");
  83. for (int i = ; i < realroad.size(); i++){
  84. printf("%d %d %I64d\n", realroad[i].from, realroad[i].to, realroad[i].val);
  85. }
  86. for (int i = ; i < zero.size(); i++){
  87. if (zero[i].val == )printf("%d %d %I64d\n", zero[i].from, zero[i].to, inf);
  88. else printf("%d %d %I64d\n", zero[i].from, zero[i].to, zero[i].val);
  89. }
  90. }
  91.  
  92. return ;
  93. }
  1. /看看会不会爆int!数组会不会少了一维!//取物问题一定要小心先手胜利的条件#include<bits/stdc++.h>usingnamespace std;#define LL longlong#define ALL(a) a.begin(), a.end()#define pb push_back
  2. #define mk make_pair
  3. #definefi first
  4. #define se second
  5. #define haha printf("haha\n")constint maxn =1000+5;const LL inf =1e17;structEdge{intfrom, to; LL val;Edge(int u =0,int v =0, LL val =0):from(u), to(v), val(val){}};
  6. vector<Edge> G[maxn];
  7. vector<Edge> zero;
  8. vector<Edge> realroad;int n, m, s, t;
  9. LL L;
  10. LL d[maxn];void dijstra(int s){
  11. queue<int> que;for(int i =0; i < n; i++) d[i]= inf;
  12. que.push(s);
  13. d[s]=0;while(!que.empty()){int u = que.front(); que.pop();int len = G[u].size();for(int i =0; i < len; i++){Edge&e = G[u][i];if(d[e.to]> d[u]+ e.val){
  14. d[e.to]= d[u]+ e.val;
  15. que.push(e.to);}}}}int main(){
  16. cin >> n >> m >> L >> s >> t;for(int i =0; i < m; i++){int u, v; LL val; scanf("%d%d%I64d",&u,&v,&val);if(val !=0){
  17. G[u].push_back(Edge(u, v, val)), G[v].push_back(Edge(v, u, val));
  18. realroad.push_back(Edge(u, v, val));}elseif(val ==0) zero.push_back(Edge(u, v, val));}
  19. dijstra(s);///printf("d[t] = %I64d\n", d[t]);if(d[t]< L){
  20. printf("NO\n");return0;}elseif(d[t]== L){
  21. printf("YES\n");for(int i =0; i < realroad.size(); i++){
  22. printf("%d %d %I64d\n", realroad[i].from, realroad[i].to, realroad[i].val);}for(int i =0; i < zero.size(); i++){
  23. printf("%d %d %I64d\n", zero[i].from, zero[i].to, inf);}return0;}for(int i =0; i < zero.size(); i++){Edge&e = zero[i];
  24. G[e.from].push_back(Edge(e.from, e.to,1));
  25. G[e.to].push_back(Edge(e.to, e.from,1));
  26. e.val =1;
  27. dijstra(s);if(d[t]<= L){
  28. e.val = L - d[t]+1;break;}}if(d[t]> L) printf("NO\n");else{
  29. printf("YES\n");for(int i =0; i < realroad.size(); i++){
  30. printf("%d %d %I64d\n", realroad[i].from, realroad[i].to, realroad[i].val);}for(int i =0; i < zero.size(); i++){if(zero[i].val ==0)printf("%d %d %I64d\n", zero[i].from, zero[i].to, inf);else printf("%d %d %I64d\n", zero[i].from, zero[i].to, zero[i].val);}}return0;}

codeforces DIV2 D 最短路的更多相关文章

  1. codeforces div2 677 D

    http://codeforces.com/problemset/problem/677/D 题目大意: 给你一个n*m的图,上面有p种钥匙(p<=n*m),每种钥匙至少有一个,期初所有为1的钥 ...

  2. codeforces div2.C

    C. New Year and Rating time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. Dynamic Shortest Path CodeForces - 843D (动态最短路)

    大意: n结点有向有权图, m个操作, 增加若干边的权重或询问源点为1的单源最短路. 本题一个特殊点在于每次只增加边权, 并且边权增加值很小, 询问量也很小. 我们可以用johnson的思想, 转化为 ...

  4. CodeForces 25C(Floyed 最短路)

    F - Roads in Berland Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

  5. codeforces div2 603 D. Secret Passwords(并查集)

    题目链接:https://codeforces.com/contest/1263/problem/D 题意:有n个小写字符串代表n个密码,加入存在两个密码有共同的字母,那么说这两个密码可以认为是同一个 ...

  6. codeforces div2 603 E. Editor(线段树)

    题目链接:https://codeforces.com/contest/1263/problem/E 题意:一个编译器,每次输入一些字符,R表示光标右移,L表示光标左移,然后有一些左括号(  和 右括 ...

  7. codeforces div2 603 C. Everyone is a Winner!(二分)

    题目链接:https://codeforces.com/contest/1263/problem/C 题意:给你一个数字n,求n/k有多少个不同的数 思路:首先K大于n时,n/k是0.然后k取值在1到 ...

  8. codeforces div2 220 解题

    这套题我只写了a, b, c..  对不起,是我太菜了. A:思路:就是直接简化为一个矩阵按照特定的步骤从一个顶角走到与之对应的对角线上的顶角.如图所示. 解释一下特定的步骤,就像马走日,象走田一样. ...

  9. codeforces div2 C题思路训练【C题好难,我好菜】

    1017C The Phone Number: 构造数列使得LIS和LDS的和最小,定理已知LIS=L,LDS=n/L的向上取整,根据样例可以得到设置L=根号n,构造方法如样例 截断法构造,不用考虑边 ...

随机推荐

  1. android项目实战 --ListView 头部ViewPager广告轮询图效果

    看开源框架:https://github.com/tianshaojie/AndroidFine,里面有如下效果,特记录学习下,以后项目中用也好能够立刻想起来.   如上面所示,是常见项目中的图片轮训 ...

  2. Spring Security(02)——关于登录

    目录 1.1     form-login元素介绍 1.1.1    使用自定义登录页面 1.1.2    指定登录后的页面 1.1.3    指定登录失败后的页面 1.2     http-basi ...

  3. Java 泛型 通配符类型

    Java 泛型 通配符类型 @author ixenos 摘要:限定通配符类型.无限定通配符类型.与普通泛型区别.通配符捕获 通配符类型 通配符的子类型限定(?都是儿孙) <? extends ...

  4. C/C++的静态库与动态库

    C/C++编程中相关文件后缀(以Linux系统下为例): .a:           静态库(archive) .c/.cpp:  C/C++源程序 .h/.hpp: C/C++源程序的头文件 .i: ...

  5. WCF、Web API、WCF REST、Web Service的区别

    Difference between WCF and Web API and WCF REST and Web Service   The .Net framework has a number of ...

  6. IOS 类的属性修饰符atomic

    在声明一个类的属性时,默认这个属性会被修饰atomic,意思是原子性访问的. nonatomic和atomic修饰的属性,在自己没有重写setter和getter的时候才会发生作用,其主要的作用可以理 ...

  7. 用Bash脚本将Linux普通用户添加为系统管理员

    将Linux普通用户添加为系统管理员在Gnome或KDE这样强大与完善的桌面环境下是非常简单的事情,一般来说在用户设置的对话框里就直接有相应选项.不过,出于简洁与高效的风格,自己目前并未使用这些高端但 ...

  8. 经典dp 编辑距离

    给定两个字符串S和T,对于T我们可以进行三种操作 (1)在任意位置增加字符 (2)删除字符 (3)替换字符 问最少多少次能把T变成S? 设f(i,j)是S的前i位和T的前j位对齐的最小花费 接下来分析 ...

  9. 洛谷-A+B Problem-洛谷的第一个任务

    题目描述 Description 输入两个整数a,b,输出它们的和(a,b<=10^9)  输入输出格式 Input/output 输入格式:两个整数以空格分开输出格式:一个数  输入输出样例  ...

  10. incallui中如何查询联系人数据

    联系人信息显示在CallCard中,提示当前正在通话的联系人号码.姓名.头像.号码类型等信息: 代码中在两个地方发起对当前联系人的查询, Init():startContactInfoSearch(c ...