比赛 20101116 评测结果 WWWWWWEAWW
题目名称 城市 最终得分 10
用户昵称 wangwangdog 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-11-16 11:25:14
显示代码纯文本
  1. #include<stdio.h>
  2. FILE *fin,*fout;
  3. long long n,m,min,find,map[4001][4001],d[4001],t[4001],money[4001],s,a,b,c,x,y,flag[4001],i,dd,j;
  4. long dij(long mon)
  5. {
  6. long oo,all=0;
  7. for(oo=1;oo<=n;oo++)
  8. {
  9. d[oo]=map[x][oo];
  10. if(money[t[oo]]>mon)flag[oo]=1;
  11. else {flag[oo]=0;all++;}
  12. }
  13. if(flag[y]==1)return -1;
  14. flag[x]=1;
  15. all--;
  16. while(all>0)
  17. {
  18. long minp;
  19. long min=2100000000;
  20. for(oo=1;oo<=n;oo++)
  21. {
  22. if(flag[oo]==0&&d[oo]<=min){min=d[oo];minp=oo;}
  23. }
  24. flag[minp]=1;
  25. all--;
  26. for(oo=1;oo<=n;oo++)
  27. {
  28. if(flag[oo]==0&&d[minp]+map[minp][oo]<d[oo])
  29. d[oo]=d[minp]+map[minp][oo];
  30. }
  31. }
  32. return d[y];
  33. }
  34. void qsort(long aa,long bb)
  35. {
  36. long t1=aa,t2=bb,t3=(aa+bb)/2;
  37. do
  38. {
  39. while(money[t[t1]]<money[t[t3]])t1++;
  40. while(money[t[t2]]>money[t[t3]])t2--;
  41. if(t1<=t2)
  42. {
  43. int o=t[t1];
  44. t[t1]=t[t2];
  45. t[t2]=o;
  46. t1++;
  47. t2--;
  48. }
  49. }
  50. while(t1<t2);
  51. if(t1<bb)qsort(t1,bb);
  52. if(t2>aa)qsort(aa,t2);
  53. }
  54. int main()
  55. {
  56. fin=fopen("cost.in","rb");
  57. fout=fopen("cost.out","wb");
  58. fscanf(fin,"%lld%lld%lld%lld%lld\n",&n,&m,&x,&y,&s);
  59. if(n<=6000)
  60. {
  61. for(i=1;i<=n;i++)
  62. {
  63. fscanf(fin,"%lld\n",&money[i]);
  64. }
  65. for(i=1;i<=n;i++)
  66. for(j=1;j<=n;j++)
  67. map[i][j]=2100000000;
  68. for(i=1;i<=m;i++)
  69. {
  70. fscanf(fin,"%lld%lld%lld\n",&a,&b,&c);
  71. if((map[a][b]!=2100000000&&c<map[a][b])||(map[a][b]==2100000000))
  72. {
  73. map[a][b]=c;
  74. map[b][a]=c;
  75. }
  76. }
  77. for(i=1;i<=n;i++)
  78. t[i]=i;
  79. qsort(1,n);
  80. find=0;
  81. min=2100000000;
  82. for(i=1;i<=n;i++)
  83. {
  84. dd=dij(money[t[i]]);
  85. if(dd<=s&&money[t[i]]<min&&dd!=-1){min=money[t[i]];find=1;break;}
  86. }
  87. if(find==0)fprintf(fout,"-1");
  88. else fprintf(fout,"%lld",min);
  89. }
  90. else fprintf(fout,"-1");
  91. fclose(fin);
  92. fclose(fout);
  93. return 0;
  94. }