求助
查看原帖
求助
1149762
liujinxv123楼主2024/9/2 11:45
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int d[N],father[N][30],mx[N][30];
struct edge{
	int v,w;
};
vector<edge> e[N];
int n,m,q;
void dfs(int x,int fa,int va){
    father[x][0] = fa;
    mx[x][0] = va;
    d[x] = d[fa] + 1;
    for(int i = 1;i <= 29;i ++){
        father[x][i] = father[father[x][i - 1]][i - 1];
        mx[x][i] = min(mx[x][i - 1],mx[father[x][i - 1]][i - 1]);
    } 
    for(int i = 0;i < e[x].size();i ++){
        int y = e[x][i].v,z = e[x][i].w;
        if(y != fa) dfs(y,x,z);
    } 
}
int LCA(int x,int y){
    int ans = 2e9;
	if(d[x] > d[y]) swap(x,y);
	for(int i = 29;i >= 0;i --){
		if(d[father[y][i]] >= d[x]){
			ans = min(ans,mx[y][i]);
			y = father[y][i];	
		} 
	}
	if(x == y) return ans;
	for(int i = 29;i >= 0;i --){
		if(father[x][i] != father[y][i]){
			ans = min(ans,min(mx[x][i],mx[y][i]));
			x = father[x][i];
			y = father[y][i];
		}
	}
	return min(ans,min(mx[x][0],mx[y][0]));
}
int fa[N];
struct node{
    int u,v,w;
}a[N];
bool cmp(node x,node y){
    return x.w > y.w;
}
int find(int x){
    if(fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}
int main(){
	cin >> n >> m;
    for(int i = 1;i <= n;i ++) fa[i] = i;
    for(int i = 1;i <= m;i ++) cin >> a[i].u >> a[i].v >> a[i].w;
    sort(a + 1,a + m + 1,cmp);
	for(int i = 1;i <= m;i ++){
        int fu = find(a[i].u),fv = find(a[i].v);
        if(fu == fv) continue;
		e[a[i].u].push_back({a[i].v,a[i].w});
		e[a[i].v].push_back({a[i].u,a[i].w});
        fa[fu] = fv;
	}
	dfs(1,0,2e9);
    cin >> q;
	while(q --){
		int x,y;
		cin >> x >> y;
		if(find(x) != find(y)) cout << "-1\n";
		else cout << LCA(x,y) << "\n";
	}
	return 0;
}

#1测试点WA了,求助

2024/9/2 11:45
加载中...