正解!求调。
查看原帖
正解!求调。
878013
_Supernova楼主2024/7/24 10:48

正解,TLE 6060 分,求调,玄关。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 5e4 + 4, N = 1e4 + 4;
int n, m, q, x, y;
int dep[N], f[N][18], g[N][18];
bool vis[N];
struct edge_ {
	int u, v, w;
} e[M];
struct edge {
	int v, w;
};
vector <edge> G[N];
int f_[N];
bool cmp(edge_ x, edge_ y) {
	return (x.w > y.w);
}
int find(int x) {
	return (f_[x] == x) ? x : (f_[x] = find(f_[x]));
}
void Kruskal(void) {
	for (int i = 1; i <= n; ++i) {
		f_[i] = i;
	}
	sort(e + 1, e + m + 1, cmp);
	int num = 0;
	for (int i = 1; i <= m; ++i) {
		int u = e[i].u, v = e[i].v, w = e[i].w;
		int fu = find(u), fv = find(v);
		if (fu != fv) {
			f_[fu] = fv;
			G[u].push_back((edge){v, w});
			G[v].push_back((edge){u, w});
			++num;
		}
		if (num == n - 1) break;
	}
	return ;
}
void dfs(int u, int fa) {
	for (int i = 0; i < G[u].size(); ++i) {
		int v = G[u][i].v, w = G[u][i].w;
		if (v == fa) continue;
		dep[v] = dep[u] + 1;
		f[v][0] = u;
		g[v][0] = w;
		dfs(v, u);
	}
	return ;
}
int Lca(int x, int y) {
	int ans = INT_MAX;
	if (dep[x] > dep[y]) swap(x, y);
	for (int d = dep[y] - dep[x], i = 0; i < 18; ++i) {
		if ((d >> i) & 1) {
			ans = min(ans, g[y][i]);
			y = f[y][i];
		}
		if (dep[x] == dep[y]) break;
	}
	if (x == y) return ans;
	for (int i = 17; i >= 0; --i) {
		if (f[x][i] != f[y][i]) {
			ans = min(ans, min(g[x][i], g[y][i]));
			x = f[x][i], y = f[y][i];
		}
	}
	ans = min(ans, min(g[x][0], g[y][0]));
	return ans;
}
int main(void) {
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= m; ++i) {
		scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].w);
	}
	Kruskal();
	memset(g, 0x3f, sizeof g);
	for (int i = 1; i <= n; ++i) {
		if (!vis[i]) {
			dfs(i, 0);
		}
	}
	for (int j = 1; j < 18; ++j) {
		for (int i = 1; i <= n; ++i) {
			f[i][j] = f[f[i][j - 1]][j - 1];
			g[i][j] = min(g[i][j - 1], g[f[i][j - 1]][j - 1]);
		}
	}
	scanf("%d", &q);
	while (q--) {
		scanf("%d %d", &x, &y);
		if (find(x) != find(y)) {
			printf("-1\n");
			continue;
		}
		int ans = Lca(x, y);
		printf("%d\n", ans);
	}
    return 0;
}
2024/7/24 10:48
加载中...