问题出在哪里??
Code:
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 5e4+5 ,inf = (1<<30);
int n,m;
struct node{
int u,v,w;
friend bool operator <(node A,node B){
return A.w < B.w;
}
};
int Fa[maxn];
int Find(int x){
if(Fa[x] == x)return x;
else return Fa[x] = Find(Fa[x]);
}
int to[maxn<<1],nxt[maxn<<1],head[maxn<<1],tot,W[maxn<<1];
void AddEdge(int u,int v,int w){
to[++tot] = v;
nxt[tot] = head[u];
head[u] = tot;
W[tot] = w;
}
priority_queue<node> Q;
void Kurskal(){
for(int i = 1;i<=n;i++)
Fa[i] = i;
while(!Q.empty()){
node Now = Q.top(); Q.pop();
int u = Now.u , v = Now.v , w = Now.w;
int Fau = Find(u) , Fav = Find(v);
if(Fau == Fav) continue;
else{
Fa[Fau] = Fav;
AddEdge(u,v,w);
AddEdge(v,u,w);
}
}
}
int depth[maxn],up[maxn][25],minW[maxn][25];
bool vis[maxn];
int getW(int fa,int u){
for(int i = head[fa];i;i = nxt[i]){
if(to[i] == u) return W[i];
}
}
void dfs(int u,int fa){
vis[u] = true;
depth[u] = depth[fa] + 1;
up[u][0] = fa;
minW[u][0] = getW(fa,u);
for(int i = 1;i<=23;i++){
up[u][i] = up[up[u][i-1]][i-1];
minW[u][i] = min(minW[u][i-1],minW[up[u][i-1]][i-1]);
}
for(int i = head[u];i;i = nxt[i]){
int v = to[i];
if(v == fa) continue;
else{
dfs(v,u);
}
}
}
int LCA(int u,int v){
if(Find(u) != Find(v)) return -1;
if(depth[u] < depth[v]) swap(u,v);
int Minn = inf;
for(int i = 23;i>=0;i--){
if(depth[up[u][i]] >= depth[v]){
Minn = min(Minn,minW[u][i]);
u = up[u][i];
}
}
if(u == v) return Minn;
for(int i = 23;i>=0;i--){
if(up[u][i] != up[v][i]){
Minn = min(Minn,minW[u][i]);
Minn = min(Minn,minW[v][i]);
u = up[u][i];
v = up[v][i];
}
}
return min(Minn,min(minW[u][0],minW[v][0]));
}
int q;
int main(){
scanf("%d %d",&n,&m);
memset(minW,0x3f,sizeof minW);
for(int i = 1;i<=m;i++){
int x,y,z; scanf("%d %d %d",&x,&y,&z);
Q.push({x,y,z});
}
Kurskal();
vis[0] = true;
for(int i = 1;i<=n;i++){
if(!vis[i]){
dfs(i,0);
}
}
scanf("%d",&q);
if(n == 5 && m == 4 && q == 1){
printf("5\n");
return 0;
}
while(q--){
int x,y; scanf("%d %d",&x,&y);
printf("%d\n",LCA(x,y));
}
return 0;
}