当前位置:   article > 正文

L3-011 直捣黄龙 (dijkstra变形)_l3-011 直捣黄龙 测试点2

l3-011 直捣黄龙 测试点2

解题思路:使用优先队列优化的dijkstra算法

  1. #include<bits/stdc++.h>
  2. #define N 201
  3. #define inf 0x3f3f3f3f
  4. using namespace std;
  5. string s1,s2,s3,s4;
  6. int num[N],pre[N],dis[N],st,ed,cnt[N],rcnt[N],sr[N],n,vis[N];
  7. map<string,int> s;
  8. string a[N];
  9. struct node
  10. {
  11. int v,d;
  12. node()
  13. {
  14. }
  15. node(int v,int d):v(v),d(d)
  16. {
  17. }
  18. };
  19. vector<node> p[N];
  20. struct node2
  21. {
  22. int v,d;
  23. node2(){
  24. }
  25. node2(int v,int d):v(v),d(d){
  26. }
  27. };
  28. bool operator<(node2 a,node2 b)
  29. {
  30. return a.d>b.d;
  31. }
  32. priority_queue<node2> q;
  33. void dijkstra()
  34. {
  35. q.push(node2(st,0));
  36. for(int i=0;i<n;i++) dis[i]=inf;
  37. dis[st]=0;rcnt[st]=1;
  38. node2 t;
  39. int u,w,v;
  40. while(!q.empty())
  41. {
  42. t=q.top();
  43. q.pop();
  44. u=t.v;w=t.d;
  45. if(vis[u]) continue;
  46. vis[u]=1;
  47. for(int i=0;i<p[u].size();i++)
  48. {
  49. v=p[u][i].v;
  50. if(dis[v]>w+p[u][i].d)
  51. {
  52. dis[v]=w+p[u][i].d;
  53. q.push(node2(v,dis[v]));
  54. sr[v]=sr[u]+num[v];
  55. rcnt[v]=rcnt[u];
  56. cnt[v]=cnt[u]+1;
  57. pre[v]=u;
  58. }else
  59. if(dis[v]==w+p[u][i].d)
  60. {
  61. rcnt[v]+=rcnt[u];
  62. if(cnt[v]<cnt[u]+1)
  63. {
  64. cnt[v]=cnt[u]+1;
  65. sr[v]=sr[u]+num[v];
  66. pre[v]=u;
  67. }else
  68. if(cnt[v]==cnt[u]+1)
  69. {
  70. if(sr[v]<sr[u]+num[v])
  71. {
  72. sr[v]=sr[u]+num[v];
  73. pre[v]=u;
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }
  80. stack<int> stk;
  81. int main()
  82. {
  83. //freopen("t.txt","r",stdin);
  84. int k,d;
  85. cin>>n>>k>>s1>>s2;
  86. s[s1]=0;a[0]=s1;
  87. for(int i=1;i<n;i++)
  88. {
  89. cin>>s3>>d;
  90. s[s3]=i;a[i]=s3;
  91. num[i]=d;
  92. }
  93. while(k--)
  94. {
  95. cin>>s3>>s4>>d;
  96. int u=s[s3],v=s[s4];
  97. p[u].push_back(node(v,d));
  98. p[v].push_back(node(u,d));
  99. }
  100. st=s[s1];
  101. ed=s[s2];
  102. pre[st]=-1;
  103. dijkstra();
  104. for(int i=ed;i!=-1;i=pre[i]) stk.push(i);
  105. cout<<a[stk.top()];
  106. stk.pop();
  107. while(!stk.empty())
  108. {
  109. cout<<"->"<<a[stk.top()];
  110. stk.pop();
  111. }
  112. cout<<endl;
  113. cout<<rcnt[ed]<<" "<<dis[ed]<<" "<<sr[ed];
  114. return 0;
  115. }

 

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

闽ICP备14008679号