D - Silver Cow Party POJ - 3268——————最短路+思维(两遍单元最短路)

ゝ一世哀愁。 2023-06-10 05:22 49阅读 0赞
题目连接

https://vjudge.net/contest/313997#problem/D

大体思路:

这个题用floyd 会T的
所以就要 这跑一边最短路, 着跑一边最短路

详细思路+代码
  1. /****** 题目要求: 是 询问 最快来回一趟, 耗时最大的那头牛所用的时间 两边单源最短路就行 ①首先可以求出 从聚会点返回到牛棚的最短路径【这个你们都会】 ②从牛棚去的时候的最短路径就是: 可以看成 从聚会点沿着路 反向的最短路( u到v 的最短路 可以看成 v到u的 沿着路反向走的最短路径) *******/
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<queue>
  6. #define ll long long
  7. using namespace std;
  8. const int maxn = 1e3+50;
  9. const ll inf = 0x3f3f3f3f;
  10. ll mp[maxn][maxn];
  11. ll mp2[maxn][maxn];// 存反向图
  12. int N, M, X;
  13. void init()
  14. {
  15. for(int i = 1;i <= N;i++)
  16. {
  17. for(int j = 1;j <= N;j++)
  18. {
  19. mp[i][j] = inf;
  20. mp2[i][j] = inf;
  21. }
  22. }
  23. for(int i = 1;i <= N;i++)
  24. {
  25. mp[i][i] = 0;
  26. mp2[i][i] = 0;
  27. }
  28. }
  29. void floyd()
  30. {
  31. for(int k = 1;k <= N;k++)
  32. for(int i = 1;i <= N;i++)
  33. for(int j = 1;j <= N;j++)
  34. if(mp[i][k]!= inf &&mp[j][k]!=inf&&mp[i][k]+mp[k][j] < mp[i][j])
  35. mp[i][j] = mp[i][k]+mp[k][j];
  36. }
  37. void spfa(int s, ll mpx[][maxn])
  38. {
  39. queue<int>q;//
  40. while(!q.empty())q.pop();//
  41. bool vis[maxn];//
  42. for(int i = 1;i <= N;i++)vis[i] = false;//
  43. ll dis[maxn];
  44. for(int i = 1;i <= N;i++)dis[i] = inf;//
  45. dis[s] = 0;//
  46. q.push(s);
  47. vis[s] = true;
  48. while(!q.empty())
  49. {
  50. int u = q.front();
  51. q.pop();
  52. vis[u] = false;
  53. for(int i = 1;i <= N;i++)
  54. {
  55. if(dis[i] > dis[u]+mpx[u][i])
  56. {
  57. dis[i] = dis[u]+mpx[u][i];
  58. if(!vis[i])
  59. {
  60. q.push(i);
  61. vis[i] = true;
  62. }
  63. }
  64. }
  65. }
  66. for(int i = 1;i <= N;i++)
  67. {
  68. mpx[s][i] = dis[i];
  69. }
  70. }
  71. int main()
  72. {
  73. scanf("%lld %lld %lld", &N, &M, &X);
  74. init();
  75. while(M--)
  76. {
  77. ll u, v, w;
  78. scanf("%lld %lld %lld", &u, &v, &w);
  79. if(w < mp[u][v])mp[u][v] = w;// 图
  80. if(w < mp2[v][u])mp2[v][u] = w;// 反向图
  81. }
  82. spfa(X, mp);
  83. spfa(X, mp2);
  84. ll ans = 0;
  85. for(int i = 1;i <= N;i++)
  86. {
  87. ans = max(ans, mp[X][i]+mp2[X][i]);
  88. }
  89. printf("%lld", ans);
  90. return 0;
  91. }

发表评论

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

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

相关阅读