悬赏 10^(-114514) RMB 倍增求调
查看原帖
悬赏 10^(-114514) RMB 倍增求调
534654
zhenjianuo2025楼主2022/10/5 19:47

/px

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m;
struct node {
	int u, v, w;
	node() {}
	node(int x, int y, int z) {
		u = x, v = y, w = z;
	}
} e[50010];
vector<pair<int, int> > g[10010];
bool vis[10010];
bool cmp(node a, node b) { return a.w > b.w; }
int fa[10010];
int find(int u) { if (fa[u] == u) return u; else return fa[u] = find(fa[u]); }
int dep[10010], p[10010][20], q[10010][20];
void dfs(int u, int f) {
	vis[u] = 1;
	dep[u] = dep[f] + 1;
	for (int i = 0; i < g[u].size(); i++) {
#define v g[u][i].first
#define w g[u][i].second
		if (v == f) continue;
		p[v][0] = u, q[v][0] = w;
		dfs(v, u);
#undef v
#undef w
	}
}
int lca(int u, int v) {
	int res = 1e9;
	if (dep[u] < dep[v]) swap(u, v);
	for (int i = 20; i >= 0; i--) 
		if (dep[p[u][i]] >= dep[v]) res = min(res, q[u][i]), u = p[u][i];
	if (u == v) return res;
	for (int i = 20; i >= 0; i--)
		if (p[u][i] != p[v][i]) res = min(res, min(q[u][i], q[v][i])), u = p[u][i], v = p[v][i];
	return min(res, min(q[u][0], q[v][0]));
}
signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) fa[i] = i;
	for (int i = 1; i <= m; i++) {
		cin >> e[i].u >> e[i].v >> e[i].w;
	}
	sort(e + 1, e + m + 1, cmp);
	for (int i = 1; i <= m; i++) {
		if (find(e[i].u) != find(e[i].v)) {
//			cout << e[i].u << " and " << e[i].v << " w " << e[i].w << "\n";
			g[e[i].u].push_back(make_pair(e[i].v, e[i].w));
			g[e[i].v].push_back(make_pair(e[i].u, e[i].w));
			fa[find(e[i].u)] = find(e[i].v);
		}
	}
	for (int i = 1; i <= n; i++)
		if (!vis[i]) {
			p[i][0] = i;
			q[i][0] = 1e9;
			dfs(i, 0);
		}
	for (int j = 1; j <= 20; j++)
		for (int v = 1; v <= n; v++)
			p[v][j] = p[p[v][j - 1]][j - 1], q[v][j] = min(q[v][j - 1], q[p[v][j - 1]][j - 1]);
	int qaq; cin >> qaq;
	while (qaq--) {
		int u, v;
		cin >> u >> v;
		if (find(u) != find(v)) cout << "-1\n";
		else cout << lca(u, v) << '\n';
	}
	return 0;
}
2022/10/5 19:47
加载中...