1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #include<bits/stdc++.h> using namespace std; #define inf 1000000005 struct Node { int u,v,w; bool operator < (const Node &b) const { return w<b.w; } }; vector <Node> e[50005]; priority_queue <Node> Q; int fa[50005]; bool vis[50005]; int fas[50005][21],minw[50005][21],deep[50005];
int find(int x) { if (x==fa[x]) return x; else return fa[x]=find(fa[x]); } void uni(int a,int b) { fa[find(a)]=find(b); }
void add(int u,int v,int w) { Node one; one.u=u; one.v=v; one.w=w; e[u].push_back(one); uni(u,v); } void dfs(int u,int f,int k) { vis[u]=1; deep[u]=k; for (int i=0;i<e[u].size();i++) { if (e[u][i].v==f) continue; else { dfs(e[u][i].v,u,k+1); fas[e[u][i].v][0]=u; minw[e[u][i].v][0]=e[u][i].w; } } } int n,m,q; void Kruskal() { int linked=0; while(!Q.empty()&&linked<n-1) { Node now=Q.top(); Q.pop(); int a=now.u,b=now.v; if (find(a)==find(b)) continue; else { linked++; add(a,b,now.w); add(b,a,now.w); } } } int lca(int x,int y) { if (find(x)!=find(y)) return -1; int ans=inf; if (deep[y] >deep[x]) swap(x,y); for(int i=20;i>=0;i--) if(deep[fas[x][i]]>=deep[y]){ ans=min(ans,minw[x][i]); x=fas[x][i]; } if (x==y) return ans; for(int i=20; i>=0; i--) if(fas[x][i]!=fas[y][i]){ ans=min(ans,min(minw[x][i],minw[y][i])); x=fas[x][i]; y=fas[y][i]; } ans=min(ans,min(minw[x][0],minw[y][0])); return ans; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) fa[i]=i; for (int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); Node one; one.u=x; one.v=y; one.w=z; Q.push(one); } Kruskal(); for (int i=1;i<=n;i++) { if (!vis[i]) { dfs(i,0,1); fas[i][0]=i; minw[i][0]=inf; } } for (int i=1;i<=20;i++) { for (int j=1;j<=n;j++) { fas[j][i]=fas[fas[j][i-1]][i-1]; minw[j][i]=min(minw[j][i-1],minw[fas[j][i-1]][i-1]); } } scanf("%d",&q); for (int i=1;i<=q;i++) { int a,b; scanf("%d%d",&a,&b); printf("%d\n",lca(a,b)); } return 0; }
|