记录编号 131534 评测结果 AAA
题目名称 [HAOI 2005]路由选择问题 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.001 s
提交时间 2014-10-24 17:00:44 内存使用 0.33 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. using namespace std;
  5. queue<int> A;
  6. bool pan[51]={0},qwq;
  7. int n,to[51][51]={0},street[51][51]={0},zui[51]={0},rezui[51][2]={0},cofr[51]={0},i,j,zj1,zj2,zj3,p,fr,en,s0,s1,s2;
  8. void init()
  9. {
  10. scanf("%d%d%d",&n,&fr,&en);
  11. for(i=1;i<=n;i++)
  12. for(p=1;p<=n;p++)
  13. {
  14. scanf("%d",&zj1);
  15. if(zj1)
  16. {
  17. to[i][0]++;
  18. to[i][ to[i][0] ]=p;
  19. street[i][p]=zj1;
  20. }
  21. }
  22. scanf("%d",&zj2);
  23. for(i=1;i<=zj2;i++)
  24. {
  25. scanf("%d",&zj1);
  26. pan[zj1]=true;
  27. }
  28. }
  29. void s0work()
  30. {
  31. for(i=1;i<=n;i++)zui[i]=0x7fffffff;
  32. zui[fr]=0;
  33. for(i=1;i<=to[fr][0];i++)
  34. if(!pan[ to[fr][i] ])
  35. {
  36. A.push(to[fr][i]);
  37. zui[ to[fr][i] ]=street[fr][ to[fr][i] ];
  38. }
  39. while(!A.empty())
  40. {
  41. zj1=A.front();A.pop();
  42. for(i=1;i<=to[zj1][0];i++)
  43. if(!pan[ to[zj1][i] ])
  44. {
  45. zj2=zui[zj1]+street[zj1][ to[zj1][i] ];
  46. if(zj2<zui[ to[zj1][i] ])
  47. {
  48. zui[ to[zj1][i] ]=zj2;
  49. A.push(to[zj1][i]);
  50. }
  51. }
  52. }
  53. s0=zui[en];
  54. }
  55. void s1ands2work()
  56. {
  57. for(i=1;i<=n;i++)rezui[i][0]=rezui[i][1]=1000000;
  58. rezui[fr][1]=0;
  59. A.push(fr);
  60. while(!A.empty())
  61. {
  62. zj1=A.front();A.pop();
  63. for(i=1;i<=to[zj1][0];i++)
  64. {
  65. qwq=false;
  66. zj2=rezui[zj1][1]+street[zj1][ to[zj1][i] ];
  67. zj3=rezui[zj1][0]+street[zj1][ to[zj1][i] ];
  68. if(zj2<rezui[ to[zj1][i] ][1])
  69. {
  70. rezui[ to[zj1][i] ][0]=rezui[ to[zj1][i] ][1];//更新第二小的值
  71. rezui[ to[zj1][i] ][1]=zj2;//更新最小值
  72. cofr[ to[zj1][i] ]=zj1;//记录转移点
  73. if(zj3<rezui[ to[zj1][i] ][0]) rezui[ to[zj1][i] ][0]=zj3;
  74. qwq=true;
  75. }
  76. else//第二小的更新
  77. if(zj2<rezui[ to[zj1][i] ][0]&&cofr[ to[zj1][i] ]!=zj1)
  78. {
  79. rezui[ to[zj1][i] ][0]=zj2;
  80. qwq=true;
  81. }
  82. if(qwq)//假如更新过,则此点入队
  83. A.push(to[zj1][i]);
  84. }
  85. }
  86. s1=rezui[en][1];
  87. s2=rezui[en][0];
  88. }
  89. int main()
  90. {
  91. freopen("route.in","r",stdin);
  92. freopen("route.out","w",stdout);
  93. init();
  94. s0work();
  95. s1ands2work();
  96. printf("%d %d %d\n",s0,s1,s2);
  97. return 0;
  98. }