dalao求调,玄关
查看原帖
dalao求调,玄关
946416
jinyanshao楼主2025/1/22 19:53

样例都过不了,qwq

码风太乱,请原谅

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
#define int long long
struct node {
	int u, v, w;
} e[N];
struct edge {
	int v, w;
};
int n, m, q;
int f[N], dep[N], vis[N];
int min_w[N][25], fa[N][25];
vector<edge> vec[N];
bool cmp(node x, node y) {
	return x.w > y.w;
}
int find(int x) {
	if (f[x] != x)return f[x] = find(f[x]);
	return x;
}
int w(int u, int v) {
	for (auto it : vec[u])if (it.v == v)return it.w;
}
void dfs(int x, int f) {
	vis[x] = 1;
	dep[x] = dep[f] + 1;
	fa[x][0] = f;
	min_w[x][0] = w(x, f);
	for (int i = 1; i <= 20; i++) {
		fa[x][i] = fa[fa[x][i - 1]][i - 1];
		min_w[x][i] = min(min_w[x][i - 1], min_w[fa[x][i - 1]][i - 1]);
	}
	for (auto it : vec[x])if (it.v != f)dfs(it.v, x);
}
void kruskal() {
	for (int i = 1; i <= n; i++)f[i] = i;
	sort(e + 1, e + n + 1, cmp);
	int cnt = n;
	for (int i = 1; i <= m; i++) {
		if (cnt == 1)break;
		int fx = find(e[i].u);
		int fy = find(e[i].v);
		if (fx == fy) continue;
		f[fx] = fy;
		cnt--;
		vec[fx].push_back({fy, e[i].w});
		vec[fy].push_back({fx, e[i].w});
	}
}
int query(int x, int y) {
	if (find(x) != find(y))return -1;
	int res = INT_MAX;
	if (dep[x] < dep[y])swap(x, y);
	for (int i = 20; i >= 0; i--) {
		if ((1 << i) & (dep[x] - dep[y])) {
			res = min(min_w[x][i], res);
			x = fa[x][i];
		}
	}
	if (x == y)return x;
	for (int i = 20; i >= 0; i--) {
		if (fa[x][i] != fa[y][i]) {
			x = fa[x][i];
			y = fa[y][i];
			res = min(min_w[x][0], res);
			res = min(min_w[y][0], res);
		}
	}
	res = min(min_w[x][0], res);
	res = min(min_w[y][0], res);
	return res;
}
signed main() {
	memset(min_w, 0x3f3f3f3f, sizeof(min_w));
	cin >> n >> m;
	for (int i = 1; i <= m; i++) cin >> e[i].u >> e[i].v >> e[i].w;
	kruskal();
	for (int i = 1; i <= n; i++)if (vis[i] != 0)dfs(i, 0);
	cin >> q;
	for (int i = 1; i <= q; i++) {
		int x, y;
		cin >> x >> y;
		cout << query(x, y) << endl;
	}
	return 0;
}
2025/1/22 19:53
加载中...