P2939-[USACO09FEB]改造路Revamping Trails

矫情吗;* 2023-06-01 08:57 27阅读 0赞
  1. 1 #include <bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define _for(i,a,b) for(int i = (a);i < b;i ++)
  4. 4 #define _rep(i,a,b) for(int i = (a);i > b;i --)
  5. 5 #define INF 0x3f3f3f3f
  6. 6 #define pb push_back
  7. 7 #define maxn 5000039
  8. 8 typedef long long ll;
  9. 9 inline ll read()
  10. 10 {
  11. 11 ll ans = 0;
  12. 12 char ch = getchar(), last = ' ';
  13. 13 while(!isdigit(ch)) last = ch, ch = getchar();
  14. 14 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
  15. 15 if(last == '-') ans = -ans;
  16. 16 return ans;
  17. 17 }
  18. 18 inline void write(ll x)
  19. 19 {
  20. 20 if(x < 0) x = -x, putchar('-');
  21. 21 if(x >= 10) write(x / 10);
  22. 22 putchar(x % 10 + '0');
  23. 23 }
  24. 24 int n,m,k;
  25. 25 int tot,ver[maxn],Next[maxn],head[maxn],val[maxn];
  26. 26 void add(int x,int y,int t)
  27. 27 {
  28. 28 ver[++tot] = y,Next[tot] = head[x],head[x] = tot,val[tot] = t;
  29. 29 }
  30. 30 typedef pair<int,int> P;
  31. 31 int d[maxn];
  32. 32 void shortest_path(int s)
  33. 33 {
  34. 34 priority_queue<P,vector<P>,greater<P>> que;
  35. 35 memset(d,0x3f,sizeof(d));
  36. 36 d[s] = 0;
  37. 37 que.push(P{
  38. 0,s});
  39. 38
  40. 39 while(!que.empty())
  41. 40 {
  42. 41 P p = que.top();que.pop();
  43. 42 int v = p.second;
  44. 43 if(d[v] < p.first) continue;
  45. 44 for(int i = head[v]; i; i = Next[i])
  46. 45 {
  47. 46 // cout << i << endl;
  48. 47 int y = ver[i];
  49. 48 int w = val[i];
  50. 49 if(d[y] > d[v] + w)
  51. 50 {
  52. 51 d[y] = d[v] + w;
  53. 52 que.push(P{d[y],y});
  54. 53 }
  55. 54 }
  56. 55 }
  57. 56 }
  58. 57 int main()
  59. 58 {
  60. 59 n = read(), m = read(), k = read();
  61. 60 _for(i,1,m+1)
  62. 61 {
  63. 62 int u,v,t;
  64. 63 u = read();v = read();t = read();
  65. 64 add(u,v,t),add(v,u,t);
  66. 65 _for(j,1,k+1)
  67. 66 {
  68. 67 add(j*n+u,j*n+v,t),add(j*n+v,j*n+u,t);
  69. 68 add((j-1)*n+u,j*n+v,0),add((j-1)*n+v,j*n+u,0);
  70. 69 }
  71. 70 }
  72. 71 shortest_path(1);
  73. 72 int ans = d[n];
  74. 73 _for(i,1,k+1)
  75. 74 ans = min(ans,d[i*n+n]);
  76. 75 write(ans);
  77. 76 return 0;
  78. 77 }

转载于:https://www.cnblogs.com/Asurudo/p/11613615.html

发表评论

表情:
评论列表 (有 0 条评论,27人围观)

还没有评论,来说两句吧...

相关阅读