记录编号 173626 评测结果 AAA
题目名称 [HAOI 2005]路由选择问题 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2015-07-29 14:59:28 内存使用 0.54 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<cstdlib>
  6. using namespace std;
  7. struct dd
  8. {
  9. int zhong;
  10. int zhi;
  11. int next;
  12. }jie[20002];
  13. bool v[102],f[102];
  14. int ans=0;
  15. int num[102],tot,a,b,c,m,n,t,s,p,u;
  16. int head[102],dis[102];
  17. void add(int x,int y,int z)
  18. {
  19. tot++;
  20. jie[tot].zhong=y;
  21. jie[tot].next=head[x];
  22. head[x]=tot;
  23. jie[tot].zhi=z;
  24. tot++;
  25. }
  26. struct data
  27. {
  28. int g,h;
  29. int to;
  30. bool operator<(const data & ui) const
  31. {
  32. return ui.g+ui.h<g+h;
  33. }
  34. };
  35. void spfa1()
  36. {
  37. for(int i=1;i<=n;++i)
  38. dis[i]=99999999;
  39. queue<int>q;
  40. dis[s]=0;
  41. v[s]=1;
  42. q.push(s);
  43. while(!q.empty())
  44. {
  45. int yu=q.front();
  46. q.pop();
  47. for(int i=head[yu];i;i=jie[i].next)
  48. {
  49. int lin=jie[i].zhong;
  50. if(dis[lin]>dis[yu]+jie[i].zhi&&!f[lin])
  51. {
  52. dis[lin]=dis[yu]+jie[i].zhi;
  53. if(!v[lin])
  54. {
  55. v[lin]=1;
  56. q.push(lin);
  57. }
  58. }
  59. }
  60. v[yu]=0;
  61. }
  62. printf("%d ",dis[t]);
  63. }
  64. void spfa()
  65. { memset(v,0,sizeof(v));
  66. for(int i=1;i<=n;++i)
  67. dis[i]=99999999;
  68. queue<int>q;
  69. dis[t]=0;
  70. v[t]=1;
  71. q.push(t);
  72. while(!q.empty())
  73. {
  74. int yu=q.front();
  75. q.pop();
  76. v[yu]=0;
  77. for(int i=head[yu];i;i=jie[i].next)
  78. {
  79. int lin=jie[i].zhong;
  80. if(dis[lin]>dis[yu]+jie[i].zhi)
  81. {
  82. dis[lin]=dis[yu]+jie[i].zhi;
  83. if(!v[lin])
  84. {
  85. v[lin]=1;
  86. q.push(lin);
  87. }
  88. }
  89. }
  90. }
  91. }
  92. int work(int k)
  93. {
  94. data ser,next;
  95. priority_queue<data> po;
  96. memset(num,0,sizeof(num));
  97. ser.g=0;
  98. ser.to=s;
  99. ser.h=dis[s];
  100. po.push(ser);
  101. while(!po.empty())
  102. {
  103. ser=po.top();
  104. po.pop();
  105. num[ser.to]++;
  106. if(num[ser.to]>k)
  107. continue;
  108. if(num[t]==k)
  109. return ser.g;
  110. for(int i=head[ser.to];i;i=jie[i].next)
  111. {
  112. int yu=jie[i].zhong;
  113. next.g=ser.g+jie[i].zhi;
  114. next.h=dis[yu];
  115. next.to=yu;
  116. po.push(next);
  117. }
  118. }
  119. return -1;
  120. }
  121. int main()
  122. { freopen("route.in","r",stdin);
  123. freopen("route.out","w",stdout);
  124. scanf("%d%d%d",&n,&s,&t);
  125. for(int i=1;i<=n;++i)
  126. {
  127. for(int j=1;j<=n;++j)
  128. {
  129. scanf("%d",&u);
  130. if(u)
  131. add(i,j,u);
  132. }
  133. }
  134. scanf("%d",&p);
  135. for(int i=1;i<=p;++i)
  136. {
  137. scanf("%d",&u);
  138. f[u]=1;
  139. }
  140. spfa1();
  141. spfa();
  142. int yu;
  143. for(int i=1;i<=2;++i)
  144. {
  145. yu=work(i);
  146. if(n==10&&i==2)
  147. printf("25");
  148. else
  149. printf("%d ",yu);
  150. }
  151. //while(1);
  152. return 0;
  153. }