当前位置:   article > 正文

练习40,小蓝的旅行【最短路】_小蓝的旅行计划 最短路经

小蓝的旅行计划 最短路经

小蓝的旅行 (nowcoder.com)

根据题意,我们知道只能从未做核酸的城市到做核酸的城市或者从做核酸的城市到未做核酸的城市,所以我们可以将每个点分别当成未做核酸的和做了核酸的,然后分别建边求最短路

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define INF 0x3f3f3f3f
  4. #define NOTLE ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  5. #define endl '\n'
  6. #define T int TT;cin >> TT;while (TT--)
  7. #define lint long long
  8. #define pb push_back
  9. #define eb emplace_back
  10. int last[800010],ne[800010],to[800010],w[800010],cnt=0; //要开4倍(无向图+是否做核酸
  11. int n,m,x;
  12. lint d[200010],vis[200010]={0};
  13. void add(int a,int b,int c){ //链式前向星存图
  14. ne[++cnt]=last[a];
  15. to[cnt]=b;
  16. w[cnt]=c;
  17. last[a]=cnt;
  18. }
  19. void SPFA(){
  20. memset(d,INF,sizeof(d));
  21. queue<int> q;
  22. q.push(1);
  23. d[1]=0,vis[1]=1;
  24. while(!q.empty()){
  25. int now=q.front();
  26. q.pop();
  27. vis[now]=0;
  28. for(int i=last[now];i;i=ne[i]){
  29. if(d[to[i]]>d[now]+w[i]){
  30. d[to[i]]=d[now]+w[i];
  31. if(!vis[to[i]]){
  32. q.push(to[i]);
  33. vis[to[i]]=1;
  34. }
  35. }
  36. }
  37. }
  38. }
  39. int main(){
  40. NOTLE;
  41. cin >> n >> m >> x;
  42. for(int i=1;i<=m;i++){
  43. int a,b,c;
  44. cin >> a >> b >> c;
  45. if(a==1){ //一开始是没有做核酸的
  46. add(a,b+n,c+x);
  47. add(b+n,a,c);
  48. }
  49. else{ //由于是无向图存两遍,而且要保证只能从有→无或无→有
  50. add(a+n,b,c);
  51. add(b,a+n,c+x);
  52. add(a,b+n,c+x);
  53. add(b+n,a,c);
  54. }
  55. }
  56. SPFA();
  57. cout << min(d[n],d[n+n]) << endl;
  58. return 0;
  59. }

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

闽ICP备14008679号