求大佬进房(玄关)
查看原帖
求大佬进房(玄关)
785505
G1yu楼主2024/6/5 16:56

rt,10pts,不知道哪里错了。

#include<bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5, M = 5e4 + 4, K = 24;
struct O {
	int from, to, val;
	friend bool operator <(O a, O b) { 
		return a.val > b.val;
	}
} path[M];
struct node {

	int to, val;
};

int n, m;
int p[N]; // 并查集数组
int d[N]; // 深度
int f[N][K]; // 倍增
int fath[N][K];  // 父亲数组
vector<node>g[N]; // 存图(krus后的新图)
int _find(int u) {
	return p[u] == u ? u : p[u] = _find(p[u]);
}

void kru() {
	for (int i = 1; i <= n; i++) {
		p[i] = i;
	}
	sort(path + 1, path + m + 1);
	for (int i = 1; i <= m; i++) {

		if (_find(path[i].from) != _find(path[i].to)) {
//				cout<<i<<"  !!\n";
			p[_find(path[i].from)] = _find(path[i].to);
			g[path[i].to].push_back({path[i].from, path[i].val});
			g[path[i].from].push_back({path[i].to, path[i].val});

		}
	}
	return ;
}

void dfs(int u, int fa) {
	d[u] = d[fa] + 1;
	fath[u][0] = fa;
	for (int i = 1; (1 << i) < d[u]; i++) {
		f[u][i] = min(f[u][i - 1], f[fath[u][i - 1]][i - 1]);
		fath[u][i] = fath[fath[u][i - 1]][i - 1];
	}
	for (int i = 0; i < g[u].size(); i++) {
		int p = g[u][i].to;

		if (p != fa) {
			f[p][0] = g[u][i].val;
			dfs(p, u);
		}
	}
}

int lca(int u, int v) {
	int ans = 2e9;
	if (d[u] < d[v]) swap(u, v);
	for (int i = K - 1; i >= 0; i--) {
//		cout << ans << '\n';
		if (d[fath[u][i]] >= d[v]) {
//			cout<<"U: " << u<< " , V:" << f[u][i] <<" i: "<< i<<'\n';
			ans = min(ans, f[u][i]);
			u = fath[u][i];
			
		}
	}
	if ( u == v) return ans;
	for (int i = K - 1; i >= 0; i--) {
		if (fath[u][i] != fath[v][i]) {

			ans = min({ans, f[u][i], f[v][i]});
			cout << ans << '\n';
			u = fath[u][i];
			v = fath[v][i];
		}
	}
	return min({f[u][0], ans, f[v][0]});
}

int main() {

	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> path[i].from >> path[i].to >> path[i].val;
	}
	kru();
	for (int i = 1; i <= n; i++) {
		if (!d[i]) dfs(i, 0);
	}
	int T;
	cin >> T;
	while (T--) {
		int x, y;
		cin >> x >> y;

		if (_find(x) != _find(y)) {
			cout << -1 << '\n';
			continue;
		}
		cout << lca(x, y) << endl;
	}
	return 0;
}
2024/6/5 16:56
加载中...