比赛 20111110 评测结果 AAAAAAAWWA
题目名称 城市 最终得分 80
用户昵称 Czb。 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-10 11:01:21
显示代码纯文本
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define min(a,b) a<b?a:b
  5.  
  6. int n,m,x,y,s,tmp,ans,flag,l[100001],f[10001],ff[10001],t[10001],u[10001][1200],v[10001][1200];
  7.  
  8. bool ok,b[10001];
  9.  
  10. int cmp(const void *a,const void *b)
  11. {
  12. return *(int *)a-*(int *)b;
  13. }
  14.  
  15. void bfs(int k)
  16. {
  17. int i,S,e;
  18. S=e=1;
  19. l[1]=k;
  20. while(S<=e)
  21. {
  22. for(i=1;i<=t[l[S]];i++)
  23. {
  24. if(u[l[S]][i]==y)
  25. {
  26. ok=true;
  27. return;
  28. }
  29. if(v[l[S]][i]+tmp<=s&&!b[u[l[S]][i]]&&ff[u[l[S]][i]]<=flag)
  30. {
  31. e++;
  32. l[e]=u[l[S]][i];
  33. b[l[e]]=true;
  34. }
  35. }
  36. S++;
  37. }
  38. }
  39.  
  40. void solve(int l,int r)
  41. {
  42. if(l>r)
  43. return;
  44. int k;
  45. k=(l+r)>>1;
  46. flag=f[k];
  47. ok=false;
  48. if(ff[x]<=flag&&ff[y]<=flag)
  49. {
  50. memset(b,0,sizeof(b));
  51. bfs(x);
  52. }
  53. if(ok)
  54. {
  55. ans=min(ans,flag);
  56. solve(l,k-1);
  57. }
  58. else
  59. {
  60. solve(k+1,r);
  61. }
  62. }
  63.  
  64. int main()
  65. {
  66. freopen("cost.in","r",stdin);
  67. freopen("cost.out","w",stdout);
  68. int i,j,a,B,c;
  69. scanf("%d%d%d%d%d",&n,&m,&x,&y,&s);
  70. for(i=1;i<=n;i++)
  71. {
  72. scanf("%d",&f[i]);
  73. ff[i]=f[i];
  74. }
  75. for(i=1;i<=m;i++)
  76. {
  77. scanf("%d%d%d",&a,&B,&c);
  78. flag=0;
  79. for(j=1;j<=t[a];j++)
  80. {
  81. if(u[a][i]==B)
  82. {
  83. flag=i;
  84. break;
  85. }
  86. }
  87. if(flag)
  88. {
  89. v[a][flag]=min(v[a][flag],c);
  90. for(j=1;j<=t[B];j++)
  91. {
  92. if(u[B][i]==a)
  93. {
  94. v[B][i]=min(v[B][i],c);
  95. break;
  96. }
  97. }
  98. }
  99. else
  100. {
  101. t[a]++;
  102. u[a][t[a]]=B;
  103. v[a][t[a]]=c;
  104. t[B]++;
  105. u[B][t[B]]=a;
  106. v[B][t[B]]=c;
  107. }
  108. }
  109. qsort(f+1,n,4,cmp);
  110. b[x]=true;
  111. ans=2000000000;
  112. solve(1,n);
  113. if(ans==2000000000)
  114. {
  115. ans=-1;
  116. }
  117. printf("%d\n",ans);
  118. fclose(stdin);
  119. fclose(stdout);
  120. return 0;
  121. }