记录编号 22037 评测结果 WWAAAWEEEA
题目名称 城市 最终得分 40
用户昵称 Gravatarlc 是否通过 未通过
代码语言 C++ 运行时间 0.427 s
提交时间 2010-11-16 19:01:01 内存使用 4.17 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<fstream>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn = 1010;
  8. long long INF;
  9. long long Dis[maxn];
  10. bool Mark[maxn];
  11. int N,M,S,T,Limit;
  12. int Cost[maxn],C[maxn]; int Gra[maxn][maxn];
  13.  
  14.  
  15.  
  16. bool cmp(const int x,const int y)
  17. {
  18. return x < y;
  19. }
  20.  
  21.  
  22. void prep()
  23. {
  24. scanf("%d%d%d%d%d",&N,&M,&S,&T,&Limit);
  25. for (int i=1; i<=N; i++) scanf("%d",&Cost[i]);
  26. for (int i=1; i<=N; i++)
  27. for (int j=1; j<=N; j++)
  28. Gra[i][j] = 2000000000;
  29. for (int i=1; i<=M; i++)
  30. {
  31. int x,y,c;
  32. scanf("%d%d%d",&x,&y,&c);
  33. Gra[x][y] = c < Gra[x][y] ? c : Gra[x][y];
  34. }
  35. }
  36.  
  37. bool Can(int LimitCost)
  38. {
  39. if (Cost[S]>LimitCost || Cost[T]>LimitCost) return false;
  40. for (int i=1; i<=N; i++) Dis[i] = INF; Dis[S] = 0;
  41. for (int i=1; i<=N; i++) Mark[i] = false;
  42. for (int i=1; i<=N; i++)
  43. {
  44. int k; long long Mink = INF;
  45. for (int j=1; j<=N; j++)
  46. if (!Mark[j] && Dis[j] <Mink && Cost[j]<=LimitCost)
  47. {
  48. Mink = Dis[j]; k = j;
  49. }
  50. Mark[k] = true;
  51. for (int j=1; j<=N; j++)
  52. if (Dis[k] + Gra[k][j] <Dis[j] && Cost[j]<=LimitCost)
  53. {
  54. Dis[j] = Dis[k] + Gra[k][j];
  55. }
  56. }
  57. return (Dis[T]<=(long long)Limit);
  58. }
  59.  
  60. void work()
  61. {
  62. INF = 100000000;
  63. INF = INF * INF;
  64. for (int i=1; i<=N; i++) C[i] = Cost[i];
  65. sort(C+1,C+1+N,cmp);
  66. int L = 1,R = N;
  67. if (!Can(C[R]))
  68. {
  69. printf("-1\n"); return;
  70. }
  71. if (Can(C[L]))
  72. {
  73. printf("%d\n",C[L]); return;
  74. }
  75. while (R - L >1)
  76. {
  77. int Mid = (L + R) / 2;
  78. if (Can(C[Mid])) R = Mid; else L = Mid;
  79. }
  80. printf("%d\n",C[R]);
  81. }
  82.  
  83. int main()
  84. {
  85. freopen("cost.in","r",stdin);
  86. freopen("cost.out","w",stdout);
  87. prep();
  88. work();
  89. return 0;
  90. }