比赛 20100421 评测结果 WWWWAWWA
题目名称 星际争霸 最终得分 25
用户昵称 ybh 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-04-21 11:27:29
显示代码纯文本
  1. #include<fstream.h>
  2. #include<cmath>
  3. #include<cstring>
  4. using namespace std;
  5. ifstream fin("starwar.in");
  6. ofstream fout("starwar.out");
  7.  
  8. int main()
  9. {
  10. static int flow[101][101],limit[101][101];
  11. static bool check[101];
  12. static int last[101];
  13. int n,m,r,i,j,ans,delta,r1,r2,x1,max=1000000000;
  14. int x[100],y[100],z[100];
  15. ans=0;
  16. fin>>n>>m>>r;
  17. r=r*r;
  18. for (i=1;i<=n;i++)
  19. {
  20. fin>>x[i]>>y[i]>>z[i];
  21. }
  22. x[0]=0;
  23. y[0]=0;
  24. z[0]=0;
  25. for (i=1;i<=m;i++)
  26. {
  27. fin>>r1>>r2;
  28. limit[r1+1][r2+1]=(x[r1]-x[r2])*(x[r1]-x[r2])+(y[r1]-y[r2])*(y[r1]-y[r2])+(z[r1]-z[r2])*(z[r1]-z[r2]);
  29. }
  30. int q[100],fa[100],dist[100];
  31. bool bb[100];
  32. memset (q,0,sizeof(q));
  33. memset (bb,false,sizeof(bb));
  34. memset (fa,0,sizeof(fa));
  35. for (i=0;i<n;i++)
  36. dist[i]=max;
  37. int h=0;
  38. int t=1;
  39. q[t]=1;
  40. bb[1]=true;
  41. dist[1]=0;
  42. while (h!=t)
  43. {
  44. h=(h%n)+1;
  45. for (i=1;i<=n+1;i++)
  46. {
  47. if ((limit[q[h]][i]>0) && (dist[q[h]]+limit[q[h]][i]<dist[i]))
  48. {
  49. dist[i]=dist[q[h]]+limit[q[h]][i];
  50. fa[i]=q[h];
  51. if (bb[i]==false)
  52. {
  53. t=(t%n)+1;
  54. q[t]=i;
  55. bb[i]=true;
  56. }
  57. }
  58. }
  59. bb[q[h]]=false;
  60. }
  61. for (i=1;i<=n+1;i++)
  62. if (dist[i]>r)
  63. limit[i][n+2]=max;
  64. for (;;)
  65. {
  66. for (i=1;i<=n+2;i++)
  67. {
  68. last[i]=0;
  69. check[i]=false;
  70. }
  71. last[1]=10000;
  72. do
  73. {
  74. i=0;
  75. do
  76. {
  77. i++;
  78. }while ((i<=n+2) && ((last[i]==0) || (check[i])));
  79. if (i>n+2)
  80. break;
  81. for (j=1;j<=n+2;j++)
  82. if (last[j]==0)
  83. {
  84. if (flow[i][j]<limit[i][j])
  85. last[j]=i;
  86. else
  87. if (flow[j][i]>0)
  88. last[j]=0-i;
  89. }
  90. check[i]=true;
  91. }while (last[n+2]==0);
  92. if (last[n+2]==0)
  93. break;
  94. delta=max;
  95. i=n+2;
  96. do
  97. {
  98. j=i;
  99. i=abs(last[j]);
  100. if (last[j]>0)
  101. x1=limit[i][j]-flow[i][j];
  102. else
  103. x1=flow[j][i];
  104. if (x1<delta)
  105. delta=x1;
  106. }while (i!=1);
  107. i=n+2;
  108. do
  109. {
  110. j=i;
  111. i=abs(last[j]);
  112. if (last[j]>0)
  113. flow[i][j]+=delta;
  114. else
  115. flow[j][i]-=delta;
  116. }while (i!=1);
  117. ans+=delta;
  118. }
  119. fout<<ans<<endl;
  120. fin.close();
  121. fout.close();
  122. return 0;
  123. }