记录编号 537336 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2013]货车运输 最终得分 100
用户昵称 Gravatarleon 是否通过 通过
代码语言 C++ 运行时间 0.722 s
提交时间 2019-07-11 11:26:10 内存使用 17.10 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #define MAXN 10005
  6. #define INF 999999999
  7. using namespace std;
  8. struct Edge1{
  9. int x,y,dis;
  10. }edge1[50005];
  11. struct Edge2{
  12. int to,next,w;
  13. }edge2[100005];
  14. int cnt,n,m,head[MAXN],deep[MAXN],f[MAXN],fa[MAXN][21],w[MAXN][21];
  15. bool vis[MAXN];
  16.  
  17. void addedge(int from, int to, int w)
  18. {
  19. edge2[++cnt].next=head[from];
  20. edge2[cnt].to=to;
  21. edge2[cnt].w=w;
  22. head[from]=cnt;
  23. return ;
  24. }
  25.  
  26. bool CMP(Edge1 x, Edge1 y)
  27. {
  28. return x.dis>y.dis;
  29. }
  30.  
  31. int find(int x){
  32. if(f[x]!=x) f[x]=find(f[x]);
  33. return f[x];
  34. }
  35.  
  36. void kruskal()
  37. {
  38. sort(edge1+1, edge1+m+1, CMP);
  39. for(int i=1; i<=n; i++)
  40. f[i]=i;
  41. for(int i=1; i<=m; i++)
  42. if(find(edge1[i].x)!=find(edge1[i].y)){
  43. f[find(edge1[i].x)]=find(edge1[i].y);
  44. addedge(edge1[i].x, edge1[i].y, edge1[i].dis);
  45. addedge(edge1[i].y, edge1[i].x, edge1[i].dis);
  46. }
  47. return ;
  48. }
  49.  
  50. void dfs(int node)
  51. {
  52. vis[node]=true;
  53. for(int i=head[node]; i; i=edge2[i].next){
  54. int to=edge2[i].to;
  55. if(vis[to]) continue;
  56. deep[to]=deep[node]+1;
  57. fa[to][0]=node;
  58. w[to][0]=edge2[i].w;
  59. dfs(to);
  60. }
  61. return ;
  62. }
  63.  
  64. int lca(int x, int y)
  65. {
  66. if(find(x)!=find(y)) return -1;
  67. int ans=INF;
  68. if(deep[x]>deep[y]) swap(x,y);
  69. for(int i=20; i>=0; i--)
  70. if(deep[fa[y][i]]>=deep[x]){
  71. ans=min(ans, w[y][i]);
  72. y=fa[y][i];
  73. }
  74. if(x==y) return ans;
  75. for(int i=20; i>=0; i--)
  76. if(fa[x][i]!=fa[y][i]){
  77. ans=min(ans, min(w[x][i], w[y][i]));
  78. x=fa[x][i];
  79. y=fa[y][i];
  80. }
  81. ans=min(ans, min(w[x][0], w[y][0]));
  82. return ans;
  83. }
  84.  
  85. int main()
  86. {
  87. freopen("truck.in","r",stdin);
  88. freopen("truck.out","w",stdout);
  89. int x,y,z,q;
  90. scanf("%d%d",&n,&m);
  91. for(int i=1; i<=m; i++){
  92. scanf("%d%d%d",&x,&y,&z);
  93. edge1[i].x=x;
  94. edge1[i].y=y;
  95. edge1[i].dis=z;
  96. }
  97. kruskal();
  98. for(int i=1; i<=n; i++)
  99. if(!vis[i]){
  100. deep[i]=1;
  101. dfs(i);
  102. fa[i][0]=i;
  103. w[i][0]=INF;
  104. }
  105. for(int i=1; i<=20; i++)
  106. for(int j=1; j<=n; j++){
  107. fa[j][i]=fa[fa[j][i-1]][i-1];
  108. w[j][i]=min(w[j][i-1], w[fa[j][i-1]][i-1]);
  109. }
  110. scanf("%d",&q);
  111. for(int i=1; i<=q; i++){
  112. scanf("%d%d",&x,&y);
  113. printf("%d\n",lca(x,y));
  114. }
  115. return 0;
  116. }
  117.  
  118.  
  119.