记录编号 98366 评测结果 AAAAAAAA
题目名称 服务点设置 最终得分 100
用户昵称 GravatarFF_Sky||幻 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2014-04-22 19:58:25 内存使用 0.57 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #define INF 0x3f3f3f3f
  4. #define N 100
  5. #define M 21000
  6. using namespace std;
  7.  
  8. int w[N][N],ver[M],next[M],head[M],h[N],d[N],c[N],n,m,tot,p;
  9.  
  10. void swap(int &x,int &y){
  11. if (x == y) return;
  12. x = x^y;
  13. y = x^y;
  14. x = x^y;
  15. }
  16.  
  17. void add(int x,int y,int z){
  18. ver[++tot] = y; next[tot] = head[x]; head[x] = tot;
  19. ver[++tot] = x; next[tot] = head[y]; head[y] = tot;
  20. }
  21.  
  22. void up(int i){
  23. for (int pp = i>>1; pp; pp = i>>1){
  24. if (d[h[i]] < d[h[pp]]){
  25. swap(c[h[i]],c[h[pp]]);
  26. swap(h[i],h[pp]);
  27. }
  28. else return;
  29. i = pp;
  30. }
  31. }
  32.  
  33. void down(int i){
  34. for (int pp = i<<1; pp <= p; pp = i<<1){
  35. if (d[h[pp+1]] < d[h[pp]] && pp < p) pp++;
  36. if (d[h[pp]] < d[h[i]]){
  37. swap(c[h[i]],c[h[pp]]);
  38. swap(h[i],h[pp]);
  39. }
  40. else return;
  41. i = pp;
  42. }
  43. }
  44.  
  45. void dijis(int st){
  46. int x,j;
  47. p = 1;
  48. memset(d,INF,sizeof(d));
  49. memset(c,0,sizeof(c));
  50. d[st] = 0;
  51. h[p] = st;
  52. while (p){
  53. x = h[1];
  54. c[x] = 0; c[h[p]] = 1;
  55. h[1] = h[p--];
  56. down(1);
  57. for (j = head[x]; j; j = next[j]){
  58. if (d[ver[j]] > d[x]+w[x][ver[j]]){
  59. d[ver[j]] = d[x]+w[x][ver[j]];
  60. if (!c[ver[j]]){
  61. h[++p] = ver[j];
  62. c[ver[j]] = p;
  63. up(p);
  64. }
  65. else up(c[ver[j]]);
  66. }
  67. }
  68. }
  69. }
  70.  
  71. int main(){
  72. freopen("djsa.in","r",stdin);
  73. freopen("djsa.out","w",stdout);
  74. int i,j,k,temp,x,y,z,minans;
  75. scanf("%d%d",&n,&m);
  76. for (i = 1; i <= m; i++){
  77. scanf("%d%d%d",&x,&y,&z);
  78. if (!w[x][y]){
  79. add(x,y,z);
  80. w[x][y] = z;
  81. w[y][x] = z;
  82. }
  83. else{
  84. w[x][y] = z;
  85. w[y][x] = z;
  86. }
  87. }
  88. minans = INF;
  89. for (i = 0; i < n; i++){
  90. dijis(i);
  91. temp = 0;
  92. for (j = 0; j < n; j++)
  93. if (d[j] > temp) temp = d[j];
  94. if (temp < minans) minans = temp,k = i;
  95. }
  96. printf("%d",k);
  97. return 0;
  98. }