唐氏弱质在线求调,悬五官
  • 板块灌水区
  • 楼主vectorxyz
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/7 16:28
  • 上次更新2024/7/7 18:23:02
查看原帖
唐氏弱质在线求调,悬五官
1114241
vectorxyz楼主2024/7/7 16:28

P1967

#include <bits/stdc++.h>

using namespace std;

const int N = 10005;

struct node
{
	int u, v, w;
}g[N];
vector<node> g1[N];
int n, m, f[N], fa[N][25], dep[N], w[N][25];
bool vis[N];

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

int find(int x)
{
	if(f[x] != x) f[x] = find(f[x]);
	return f[x];
}

void kruskal()
{
	sort(g + 1,g + 1 + m, cmp);
	for(int i = 1;i <= n;i ++ ) f[i] = i;
	for(int i = 1;i <= m;i ++ )
	{
		if(find(g[i].u) != find(g[i].v)){
			f[find(g[i].u)] = find(g[i].v);
			g1[g[i].u].push_back({g[i].v, g[i].w});
			g1[g[i].v].push_back({g[i].u, g[i].w});
		}
	}
}

void dfs(int u)
{
//	cout << u << endl;
	vis[u] = true;
	for(int i = 0;i < g1[u].size();i ++ ){
		int v = g1[u][i].v;
		if(vis[v]) continue;
		dep[v] = dep[u] + 1;
		w[v][0] = g1[u][i].w;
		fa[v][0] = u;
		dfs(v);
	}
} 

int LCA(int x, int y)
{
	if(find(x) != find(y)) return -1;
	if(dep[x] < dep[y]) swap(x, y);
	int ans = INT_MAX;
	for(int i = 20;i >= 0;i -- )
	{
		if(dep[fa[x][i]] >= dep[y]){
			ans = min(ans, w[x][i]);
			x = fa[x][i];
		}
	}
	if(x == y) return ans;
	for(int i = 20;i >= 0;i -- )
	{
		if(fa[x][i] != fa[y][i]){
			ans = min(ans, min(w[x][i], w[y][i]));
			x = fa[x][i], y = fa[y][i];
		}
	}
	ans = min(ans, min(w[x][0], w[y][0]));
	return ans;
}

int main()
{
	cin >> n >> m;
	for(int i = 1;i <= m;i ++){
		int x, y, z;
		cin >> x >> y >> z;
		g[i].u = x;
		g[i].v = y;
		g[i].w = z;
	}
	kruskal();
	for(int i = 1;i <= n;i ++ )
	{
		if(!vis[i])
		{
			dep[i] = 1;
			dfs(i);
			fa[i][0] = i;
			w[i][0] = INT_MAX;
		}
	}
	for(int j = 1;j <= 20;j ++ )
	{
		for(int i = 1;i <= n;i ++)
		{
			fa[i][j] = fa[fa[i][j - 1]][j - 1];
			w[i][j] = min(w[i][j - 1], w[fa[i][j - 1]][j - 1]); 
		}
	}
	int q;
	cin >> q;
	while(q -- )
	{
		int x, y;
		cin >> x >> y;
		cout << LCA(x, y) << endl;
	}
	return 0; 
} 
2024/7/7 16:28
加载中...