比赛 20140414 评测结果 AAAAWWWWWA
题目名称 路障 最终得分 50
用户昵称 Cirno 运行时间 0.020 s
代码语言 C++ 内存使用 0.55 MiB
提交时间 2014-04-14 11:20:54
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int pa[251][251]={0};//pa[x][y]为x到y的邻接矩阵
  5. int path[251]={0};
  6. int fin=0,num;
  7. int father[251]={0};
  8. int N,M,x,y,val;
  9. int i;
  10. int sum=0;
  11. int ans=0;
  12. int fath=0;
  13. bool view[251]={0};
  14. void init()
  15. {
  16. freopen("rblock.in","r",stdin);
  17. cin>>N>>M;
  18. for(i=1;i<=M;i++)
  19. {
  20. cin>>x>>y>>val,pa[x][y]=val,pa[y][x]=val;
  21. }
  22. }
  23. void dij(int point)
  24. {
  25. for(i=1;i<=N;i++)
  26. {
  27. if(i!=point)//不带自己
  28. {
  29. if(pa[point][i]!=0)//有边连接
  30. {
  31. if(!path[i])
  32. father[i]=point,path[i]=path[point]+pa[point][i],fin++;//首次发现
  33. if(path[point]+pa[point][i]<path[i])
  34. father[i]=point,path[i]=path[point]+pa[point][i];//更新值
  35. }
  36. }
  37. }
  38. view[point]=1;
  39. for(i=1;i<=N;i++)
  40. {
  41. if(i!=point)
  42. {if(pa[point][i]!=0&&view[i]!=1)//有边连接
  43. dij(i);
  44. }
  45. }
  46. }
  47. void dij1(int point)
  48. {
  49. for(i=1;i<=N;i++)
  50. {
  51. if(i!=point)//不带自己
  52. {
  53. if(pa[point][i]!=0)//有边连接
  54. {
  55. if(!path[i])
  56. path[i]=path[point]+pa[point][i],fin++;//首次发现
  57. if(path[point]+pa[point][i]<path[i])
  58. path[i]=path[point]+pa[point][i];//更新值
  59. }
  60. }
  61. }
  62. view[point]=1;
  63. for(i=1;i<=N;i++)
  64. {
  65. if(i!=point)
  66. {if(pa[point][i]!=0&&view[i]!=1)//有边连接
  67. dij(i);
  68. }
  69. }
  70. }
  71. void ke()
  72. {
  73. for(i=1;i<=250;i++)
  74. path[i]=0,view[i]=0;
  75. path[1]=0;
  76. }
  77. void findfather(int point)
  78. {
  79. if(point!=1)
  80. {
  81. fath=father[point];
  82. pa[fath][point]*=2,pa[point][fath]*=2;
  83. ke();
  84. dij1(1);
  85. ans=max(ans,path[N]-sum);
  86. pa[fath][point]/=2,pa[point][fath]/=2;
  87. findfather(fath);
  88. }
  89. return;
  90. }
  91. void out()
  92. {
  93. freopen("rblock.out","w",stdout);
  94. cout<<ans<<endl;
  95. }
  96. int main()
  97. {
  98. init();
  99. path[1]=0;
  100. dij(1);
  101. sum=path[N];
  102. findfather(N);
  103. out();
  104. }