LCA求调
查看原帖
LCA求调
1046030
Rainbow_rabbit楼主2025/1/15 18:55
#include <bits/stdc++.h>
using namespace std ;

struct node
{
	int a , b , c ;
};
int n , m , q , fa[20004] , sn , h[20004] , deep[20004] , pa[20004][20] , lg[20004] ;
node w[50004] ;
vector <int> v[20004] ;

bool cmp( node a , node b )
{
	return a.c > b.c ;
}

int find( int x )
{
	while( fa[x] != x )
	{
		x = fa[x] = fa[fa[x]] ;
	}
	return x ;
}

void dfs(int now, int fa) 
{
	pa[now][0] = fa; 
	deep[now] = deep[fa] + 1;
	for( int i = 1; i <= lg[deep[now]]; ++i )
	{
		pa[now][i] = pa[pa[now][i-1]][i-1];
	}
	for(int i = 0 ; i < v[now].size() ; i ++ )
	{
		if(v[now][i] != fa) dfs(v[now][i],now);
	}
}

int LCA(int x, int y) 
{
	if(deep[x] < deep[y]) swap(x, y) ;
	while(deep[x] > deep[y])x = pa[x][lg[deep[x]-deep[y]] - 1];
	if(x == y) return x;
	for(int k = 19; k >= 0; --k )
	{
		if(pa[x][k] != pa[y][k])
		{
			x = pa[x][k], y = pa[y][k];
		}
	}
	return pa[x][0];
}

int main()
{
	cin >> n >> m ;
	sn = n ;
	for(int i = 1; i <= n; ++i) lg[i] = lg[i-1] + (1 << lg[i-1] == i);
	for( int i = 1 ; i <= 2 * n ; i ++ )
	{
		fa[i] = i ;
	}
	for( int i = 1 ; i <= m ; i ++ )
	{
		cin >> w[i].a >> w[i].b >> w[i].c ;
	}
	sort( w + 1 , w + n + 1 , cmp ) ;
	for( int i = 1 ; i <= m ; i ++ )
	{
		if( sn - n == n - 1 ) break ;
		if( find(w[i].a) == find(w[i].b) ) continue ;
		sn ++ ;
		v[sn].push_back(find(w[i].a));
		v[sn].push_back(find(w[i].b));
		fa[find(w[i].a)] = sn ;
		fa[find(w[i].b)] = sn ;
		h[sn] = w[i].c ;
	}
	// 5 7
	// 4 3 1
	// 3 1 5
	// 1 3 7
	// 2 4 6
	// 5 3 2
	// 4 3 3
	// 3 1 4
	// for( int i = 1 ; i <= sn ; i ++ )
	// {
	// 	cout << i << " " ;
	// 	for( int j = 0 ; j < v[i].size() ; j ++ )
	// 	{
	// 		cout << v[i][j] << " " ;
	// 	}
	// 	cout << endl ;
	// }
	for( int i = sn ; i >= 1 ; i -- )
	{
		if(!deep[i])dfs( i , 0 ) ;
	}
	cin >> q ;
	for( int i = 1 ; i <= q ; i ++ )
	{
		int a , b ;
		cin >> a >> b ;
		if( find(a) != find(b) ) cout << -1 << endl ;
		else cout << h[LCA( a , b )] << endl ;
	}
	return 0 ;
}
2025/1/15 18:55
加载中...