样例只输出-1,求条,玄关
查看原帖
样例只输出-1,求条,玄关
1047636
_ScreamBrother_楼主2024/12/15 17:15
#include <bits/stdc++.h>

struct Node {
	int u, v, w;
	Node (int u, int v, int w) : u(u), v(v), w(w) {};
	bool operator < (Node _) { return w > _.w; }
};

int N, M, S, x, y, f[500010], g[5000010][22];
int lg[500010], fa[500010][22], dep[500010], sum[500010];
std::vector <Node> a;
std::vector < std::pair <int, int> > G[500010];

int find(int x) { return x != f[x] ? (f[x] = find(f[x])) : x; }
void merge(int x, int y) { f[find(x)] = find(y); }
bool query(int x, int y) { return find(x) == find(y); }

int read() {
	int s = 0, w = 1;
	char ch = getchar();
	for (; ch < '0' || ch > '9'; ch = getchar()) w = ch == '-' ? -1 : 1; 
	for (; ch >= '0' && ch <= '9'; ch = getchar()) s = s * 10 + ch - '0';
	return s * w;
}

void write(int x) {
	if(x < 0) putchar('-'), x = -x;
	if(x > 9) write(x / 10);
	putchar(x % 10 + '0');
}

void Kruskal() {
	for (int i = 1; i <= N; i ++) f[i] = i;
	std::sort(a.begin(), a.end());
	for (int i = 0; i < M; i ++) {
		if (!query(a[i].u, a[i].v)) {
			merge(a[i].u, a[i].v);
			G[a[i].u].push_back({a[i].w, a[i].v});
			G[a[i].v].push_back({a[i].w, a[i].u});
		}
	}
}

void init_log2() {
	for (int i = 1; i <= N; i ++) lg[i] = lg[i - 1] + ((1 << lg[i - 1]) == i);
	for (int j = 1; j <= 20; j ++)
		for (int i = 1; i <= N; i ++) {
			fa[i][j] = fa[fa[i][j - 1]][j - 1];
			g[i][j] = std::min(g[i][j - 1], g[fa[i][j - 1]][j - 1]);
		}
}

void dfs(int node, int fath) {
	dep[node] = dep[fath] + 1, fa[node][0] = fath;
	for (int i = 0; i < G[node].size(); i ++)
		if (G[node][i].second != fath) {
			g[G[node][i].second][0] = G[node][i].first;
			dfs(G[node][i].second, node);
		}
}

int LCA(int a, int b) {
	if (!query(a, b)) return -1;
	int ans = 1145141919;
	if (dep[a] < dep[b]) std::swap(a, b);
	while (dep[a] > dep[b]) {
		ans = std::min(ans, g[a][lg[dep[a] - dep[b]] - 1]);
		a = fa[a][lg[dep[a] - dep[b]] - 1];
	}
	if (a == b) return a;
	for (int k = lg[dep[a]] - 1; k >= 0; k --)
		if (fa[a][k] != fa[b][k]) {
			ans = std::min({ans, g[a][k], g[b][k]});
			a = fa[a][k], b = fa[b][k];
		}
	return std::min({ans, g[a][0], g[b][1]});
}

int main() {
	N = read(), M = read();
	for (int i = 1; i <= M; i ++) a.push_back(Node(read(), read(), read()));
	Kruskal();
	for (int i = 1; i <= N; i ++) 
		if (f[i] == i) dfs(i, 0);
	init_log2();
	while (M --) {
		x = read(), y = read();
		write(LCA(x, y)), puts("");
	}
	return 0;
}
2024/12/15 17:15
加载中...