当前位置:   article > 正文

2021 RoboCom 世界机器人开发者大赛-本科组(决赛)7-4猛犸不上 Ban(最短路)_7-4 猛犸不上 ban

7-4 猛犸不上 ban

 样例输入:

  1. 5 6 1 5
  2. 1 2 1
  3. 2 3 2
  4. 3 4 3
  5. 4 1 5
  6. 3 5 4
  7. 4 5 1

样例输出:

  1. 11 6
  2. Lose!

分析:对于第二种选择显然直接跑一边最短路就可以了,这里就不多说了,下面主要说一下第一种选择。我一开始以为直接跑一个最短路就行,对于第一种说的回到s点,直接枚举与s存在直接边的j,求一个min(d[j]+dis[j][s])即可,但是发现样例都不对,模拟了一下发现存在重边,也就是说从s到j求最短路时经过了直接边s->j,所以就会产生错误,然后就发现思路错了,我就尝试了一下跑多次最短路,也就是对于每一个和s有直接边的j,我都直接跑一边最短路,但是这次最短路不能经过s->j这条边,然后我们再求一下d[j]+dis[j][s],最后取一个最小值即可。交了之后有一个超时,但是看了一下边数和点数,边数是1e5,点数是500,因为我写的是堆优化版的dijkstra,复杂度是O(mlogm),而这道题给的是一个稠密图,所以最好是用朴素版的最短路,直接换成朴素版的就能过了。复杂度是O(n^3)

细节见代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<map>
  6. #include<queue>
  7. #include<vector>
  8. #include<cmath>
  9. using namespace std;
  10. const int N=1e6+10;
  11. typedef pair<int,int>PII;
  12. int d[N],n;
  13. int p[503][503];
  14. bool vis[N];
  15. void dijkstra(int x,int u,int v)
  16. {
  17. memset(vis,false,sizeof vis);
  18. memset(d,0x3f,sizeof d);
  19. d[x]=0;
  20. for(int i=1;i<n;i++)
  21. {
  22. int t=-1;
  23. for(int j=1;j<=n;j++)
  24. if(!vis[j]&&(t==-1||d[t]>d[j])) t=j;
  25. vis[t]=true;
  26. for(int j=1;j<=n;j++)
  27. {
  28. if(t==u&&j==v) continue;
  29. if(d[j]>d[t]+p[t][j]) d[j]=d[t]+p[t][j];
  30. }
  31. }
  32. }
  33. int main()
  34. {
  35. int m,s,t;
  36. cin>>n>>m>>s>>t;
  37. memset(p,0x3f,sizeof p);
  38. for(int i=1;i<=m;i++)
  39. {
  40. int u,v,t;
  41. scanf("%d%d%d",&u,&v,&t);
  42. p[u][v]=p[v][u]=t;
  43. }
  44. int t1=0x3f3f3f3f;
  45. for(int i=1;i<=n;i++)
  46. {
  47. if(i==s||p[i][s]==0x3f3f3f3f) continue;
  48. dijkstra(s,s,i);
  49. t1=min(t1,d[i]+p[i][s]);
  50. }
  51. dijkstra(s,0,0);
  52. int t2=d[t];
  53. if(t1==0x3f3f3f3f) printf("-1 ");
  54. else printf("%d ",t1);
  55. if(t2==0x3f3f3f3f) printf("-1\n");
  56. else printf("%d\n",t2);
  57. if(t1!=0x3f3f3f3f&&t1<t2) printf("Win!");
  58. else printf("Lose!");
  59. return 0;
  60. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/910279
推荐阅读
相关标签
  

闽ICP备14008679号