当前位置:   article > 正文

团体程序设计天梯赛(L3-011 直捣黄龙 (30 分))_天梯赛直捣黄龙c语言

天梯赛直捣黄龙c语言

题目:

思路分析:

一个多条件的最短路模型(魔改dij就行

多几个限制条件而已

发现pta上面都是dij的模型 来几个堆优化的题目也算呀! 

代码实现:

  1. /*
  2. *@Author: GuoJinlong
  3. *@Language: C++
  4. */
  5. //#include <bits/stdc++.h>
  6. /*
  7. * __----~~~~~~~~~~~------___
  8. * . . ~~//====...... __--~ ~~
  9. * -. \_|// |||\\ ~~~~~~::::... /~
  10. * ___-==_ _-~o~ \/ ||| \\ _/~~-
  11. * __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~
  12. * _-~~ .=~ | \\-_ '-~7 /- / || \ /
  13. * .~ .~ | \\ -_ / /- / || \ /
  14. * / ____ / | \\ ~-_/ /|- _/ .|| \ /
  15. * |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\
  16. * ' ~-| /| |-~\~~ __--~~
  17. * |-~~-_/ | | ~\_ _-~ /\
  18. * / \ \__ \/~ \__
  19. * _--~ _/ | .-~~____--~-/ ~~==.
  20. * ((->/~ '.|||' -_| ~~-/ , . _||
  21. * -_ ~\ ~~---l__i__i__i--~~_/
  22. * _-~-__ ~) \--______________--~~
  23. * //.-~~~-~_--~- |-------~~~~~~~~
  24. * //.-~~~--\
  25. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26. *
  27. * 神兽保佑 永无BUG
  28. */
  29. const int MAX=1001;
  30. int vis[MAX];
  31. int dis[MAX][MAX];
  32. int di[MAX];
  33. int diss[MAX];
  34. int point[MAX];
  35. int pre[MAX];
  36. int path[MAX];
  37. int a[MAX];
  38. int n,k;
  39. map<string,int>mp;
  40. map<int,string>mp1;
  41. void dij(){
  42. mms(vis,0);
  43. mms(pre,-1);
  44. mms(diss,INF);
  45. diss[1]=0;
  46. di[1]=0;
  47. point[1]=0;
  48. path[1]=1;
  49. for(int i=1;i<=n;i++){
  50. int v=-1;
  51. int m1=INF;
  52. for(int j=1;j<=n;j++){
  53. if(!vis[j]&&diss[j]<m1){
  54. m1=diss[j];
  55. v=j;
  56. }
  57. }
  58. vis[v]=1;
  59. for(int j=1;j<=n;j++){
  60. if(!vis[j]){
  61. if(diss[j]>diss[v]+dis[v][j]){
  62. diss[j]=diss[v]+dis[v][j];
  63. path[j]=path[v];
  64. pre[j]=v;
  65. di[j]=di[v]+a[j];
  66. point[j]=point[v]+1;
  67. }
  68. else if(diss[j]==diss[v]+dis[v][j]){
  69. path[j]+=path[v];
  70. if(point[j]<point[v]+1){
  71. point[j]=point[v]+1;
  72. di[j]=di[v]+a[j];
  73. pre[j]=v;
  74. }
  75. else if(point[j]==point[v]+1){
  76. if(di[j]<di[v]+a[j]){
  77. di[j]=di[v]+a[j];
  78. pre[j]=v;
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. int main(){
  87. string st,en;
  88. mms(dis,INF);
  89. cin>>n>>k>>st>>en;
  90. int num=1;
  91. mp[st]=num++;
  92. mp1[1]=st;
  93. for(int i=1;i<=n-1;i++){
  94. string s;
  95. int x;
  96. cin>>s>>x;
  97. mp[s]=num++;
  98. mp1[mp[s]]=s;
  99. a[mp[s]]=x;
  100. }
  101. while (k--) {
  102. string a,b;
  103. int x;
  104. cin>>a>>b>>x;
  105. int x1=mp[a];
  106. int x2=mp[b];
  107. dis[x1][x2]=x;
  108. dis[x2][x1]=x;
  109. }
  110. dij();
  111. vector<string>p;
  112. int x=mp[en];
  113. while (x!=-1) {
  114. p.push_back(mp1[x]);
  115. x=pre[x];
  116. }
  117. // cout<<p.size();
  118. reverse(p.begin(),p.end());
  119. for(int i=0;i<p.size();i++){
  120. if(i==0)cout<<p[i];
  121. else cout<<"->"<<p[i];
  122. }
  123. cout<<endl;
  124. x=mp[en];
  125. cout<<path[x]<<" "<<diss[x]<<" "<<di[x];
  126. }

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

闽ICP备14008679号