记录编号 220705 评测结果 AAAAA
题目名称 [HAOI 2005]希望小学 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.001 s
提交时间 2016-01-20 10:22:59 内存使用 0.30 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #define max(a,b) a>b?a:b
  4. int x[33],y[33];
  5. int disb[33][33],disg[33][33];
  6. bool inq[33];
  7. int q[30];
  8. int head,tail;
  9. void add(int a){
  10. if(!inq[a]){
  11. q[tail++]=a;
  12. inq[a]=true;
  13. if(tail==30)tail=0;
  14. }
  15. }
  16. void _add(int a){
  17. if(!inq[a]){
  18. if(head!=0)q[--head]=a;
  19. else {
  20. head = 29;
  21. q[29] = a;
  22. }
  23. inq[a] = true;
  24. }
  25. }
  26. void del(){
  27. inq[q[head]]=false;
  28. head=(head+1)%30;
  29. }
  30. int n;
  31. void spfa(int d[][33],int s){
  32. memset(inq,0,sizeof(inq));
  33. memset(q,0,sizeof(q));
  34. for(int i = 1;i<=n;++i)if(s!=i&&d[s][i]!=1<<20)add(i);
  35. while(head!=tail){
  36. int v = q[head];
  37. for(int i = 1;i<=n;++i){
  38. if(d[s][v]+d[v][i]<d[s][i]){
  39. d[s][i]=d[s][v]+d[v][i];
  40. if(d[s][i]>d[s][q[head]])add(i);
  41. else _add(i);
  42. }
  43. }
  44. del();
  45. }
  46. }
  47. int main(){
  48. freopen("hopeschool.in","r",stdin);
  49. freopen("hopeschool.out","w",stdout);
  50. int b1,b2,b3,g1,g2,g3;
  51. scanf("%d %d %d %d %d %d %d",&n,&b1,&b2,&b3,&g1,&g2,&g3);
  52. for(int i = 1;i<=n;++i)scanf("%d",x+i);
  53. for(int i = 1;i<=n;++i)scanf("%d",y+i);
  54. int k;
  55. scanf("%d",&k);
  56. int a,b,s1,s2,s3;
  57. for(int i = 1;i<=n;++i){
  58. for(int j = 1;j<=n;++j)
  59. disb[i][j] = disg[i][j] = 1<<20;
  60. }
  61. for(int i = 0;i<k;++i){
  62. scanf("%d %d %d %d %d",&a,&b,&s1,&s2,&s3);
  63. disb[a][b]=s1*b1+s2*b2+s3*b3;
  64. disb[b][a]=s1*b1+s2*b3+s3*b2;
  65. disg[a][b]=s1*g1+s2*g2+s3*g3;
  66. disg[b][a]=s1*g1+g2*s3+g3*s2;
  67. }
  68. for(int i = 1;i<=n;++i){
  69. spfa(disb,i);
  70. spfa(disg,i);
  71. }
  72. int mintot = 1<<25,ans = -1;
  73. for(int i = 1;i<=n;++i){
  74. int nowtot = 0;
  75. for(int j = 1;j<=n;++j){
  76. if(i!=j){
  77. nowtot+=x[j]*disb[j][i];
  78. nowtot+=y[j]*disg[j][i];
  79. }
  80. }
  81. if(nowtot<mintot){
  82. mintot=nowtot;
  83. ans = i;
  84. }
  85. }
  86. printf("%d\n",ans);
  87. fclose(stdin);fclose(stdout);
  88. return 0;
  89. }