已经崩溃のSyx 求助 LCA+Kruscal 重构图 模板题

code

#include <bits/stdc++.h>
using namespace std;
namespace Syxqwq {
	inline int read() {
		int x = 0, s = 1;
		char c = getchar();
		while (c > '9' || c < '0') {
			if (c == '-') s = -1;
			c = getchar();
		}
		while (c >= '0' && c <= '9') {
			x = (x << 1) + (x << 3) + (c - '0');
			c = getchar();
		}
		return x * s;
	}
	void Write(int x) {
		if (x < 0) {
			putchar('-');
			x = -x;
		}
		if (x > 9) Write(x / 10);
		putchar(x % 10 + '0');
	}
	inline void write(int x, char c) {
		Write(x), putchar(c);
	}
}
using namespace Syxqwq;
const int N = 2e5 + 10;
int head[N], f[N][21], g[N][21], fa[N], depth[N], n, m, ans, idx;
struct edge {
	int u, v, z, nxt;
} e[N];
struct node {
	int u, v, z;
} nd[N];
inline void insert(int x, int v, int z) {
	e[++idx].u = x;
	e[idx].v = v;
	e[idx].z = z;
	e[idx].nxt = head[x];
	head[x] = idx;
}
inline void initlca() {
	for (int j = 1; j <= 20; ++j) for (int i = 1; i <= n; ++i) {
			g[i][j] = max(g[i][j - 1], g[f[i][j - 1]][j - 1]);
			f[i][j] = f[f[i][j - 1]][j - 1];
		}
}
void dfs(int u, int F, int c, int val) {
	f[u][0] = F;
	depth[u] = c;
	g[u][0] = val;
	for (int i = head[u]; i; i = e[i].nxt) {
		int v = e[i].v;
		if (v != F) dfs(v, u, c + 1, e[i].z);
	}
}
int LCA(int a, int b) {
	if (depth[a] < depth[b]) swap(a, b);
	int ret = 0;
	int t = depth[a] - depth[b];
	for (int i = 0; i <= 20; ++i) if (t & (1 << i)) {
			ret = max(ret, g[a][i]);
			a = f[a][i];
		}
	for (int i = 20; i >= 0; --i) if (f[a][i] != f[b][i]) {
			ret = max(ret, g[a][i]);
			ret = max(ret, g[b][i]);
			a = f[a][i];
			b = f[b][i];
		}
	ret = max(ret, max(g[a][0], g[b][0]));
	return ret;
}
inline int find(int x) {
	while (x != fa[x]) x = fa[x] = fa[fa[x]];
	return x;
}
inline void kruscal() {
	int cnt = 0;
	for (int i = 1; i <= m; ++i) {
		int fa1 = find(nd[i].u), fa2 = find(nd[i].v);
		if (fa1 != fa2) {
			fa[fa2] = fa1;
			cnt++;
			insert(nd[i].u, nd[i].v, nd[i].z);
			insert(nd[i].v, nd[i].u, nd[i].z);
		}
		if (cnt == n - 1) break;
	}
}
int main() {
	n = read(), m = read();
	for (int i = 1; i <= m; ++i) {
		nd[i].u = read(), nd[i].v = read(), nd[i].z = read();
	}
	sort(nd + 1, nd + m + 1, [&](node a, node b) {return a.z < b.z;});
	for (int i = 1; i <= n; ++i) fa[i] = i;
	kruscal();
	int t = read();
	dfs(1, 0, 0, 0);
	initlca();
	while (t--) {
		int x = read(), y = read();
		printf("%d\n", LCA(x, y));
	}
	return 0;
}
2 个赞

码风丑,勿喷

2 个赞

膜拜巨佬,但是我确实不会,而且马蜂还行吧

2 个赞

那是因为 Ctrl + Shift + A 过了

2 个赞

可是我听都没听过啊,帮不了你

2 个赞

目前报错:

#4 第 3495 行输出了一个 0

2 个赞

???

2 个赞

我来了

2 个赞

喵呜~

2 个赞

大佬现在问题解决了吗

2 个赞

所以现在拿了几分

2 个赞

挂飞,30 分

3 个赞

我先帮你调一调吧,你可以去看看我写的题解 day 8 生成树笔记
(在最下面)或许可以帮到你
qwq

2 个赞

那我先谢谢啦

3 个赞

等一下!
有一个样例可以把你卡掉

10 10
1 9 114514
2 8 114514
3 7 114514
5 3 1244
10 3 123123
9 8 123
3 5 1324
2 5 12
2 4 24
3 6 134
4
1 4
2 8
3 6
1 10

输出本来应该是

114514
114514
134
123123

但你输出了

114514
114514
1244 // 这个不对
123123

很显然样例给的 36 是直接用一条边连起来的
但是你的程序绕路了 qwq
因为我看不懂你的lca求法,所以你就拿着这组样例去调吧 awa

2 个赞

好臭的数据

2 个赞