萌新刚学点分治TLE75,求调
查看原帖
萌新刚学点分治TLE75,求调
1213511
gw2204楼主2024/7/18 19:28
#include<bits/stdc++.h>
using namespace std;
int n, k, rt = 0, siz[2000010], mx[2000010], dep[2000010], dis[2000010], dfn[2000010], now, ans = 1e9, minn[2000010], all;
bool vis[2000010];
struct edge {
	int to, val;
};
vector <edge> v[2000010];
int read() {
	int sum = 0, d = 1;
	char c;
	c = getchar();
	while(!isdigit(c)) d = c == '-' ? -d : d, c = getchar();
	while(isdigit(c)) sum = (sum << 3) + (sum << 1) + c - 48, c = getchar();
	return sum * d;
}
void get_root(int fa, int x) {
	siz[x] = 1;
	mx[x] = 0;
	for (auto i : v[x]) {
		if (i.to != fa && vis[i.to] == 0) {
			get_root(x, i.to);
			siz[x] += siz[i.to];
			mx[x] = max(mx[x], siz[i.to]);
		}
	}
	mx[x] = max(mx[x], all - siz[x]);
	if (mx[x] < mx[rt]) rt = x;
}
void get_tree(int fa, int x, int deep, int dist) {
	if (dist > k) return ;
	dfn[++now] = x;
	dep[x] = deep;
	dis[x] = dist;
	for (auto i : v[x]) {
		if (i.to != fa  && vis[i.to] == 0) {
			get_tree(x, i.to, deep + 1, dist + i.val);
		}
	}
}
void dfz(int x) {
	vis[x] = 1;
	now = 0;
	minn[0] = 0;
	for (auto i : v[x]) {
		if (vis[i.to] == 0) {
			int lst = now;
			get_tree(x, i.to, 1, i.val);
			for (int j = lst + 1; j <= now; j++) {
				ans = min(ans, minn[k - dis[dfn[j]]] + dep[dfn[j]]);
			}
			for (int j = lst + 1; j <= now; j++) {
				minn[dis[dfn[j]]] = min(minn[dis[dfn[j]]], dep[dfn[j]]);
			}
		}
	}
	for (int i = 1; i <= now; i++) {
		minn[dis[dfn[i]]] = 1e9;
	}
	for (auto i : v[x]) {
		if (vis[i.to] == 0) {
			rt = 0;
			all = siz[i.to];
			get_root(x, i.to);
			dfz(i.to);
		}
	}
}
int main() {
	n = read(), k = read();
	for (int i = 1, x, y, z; i < n; i++) {
		x = read() + 1, y = read() + 1, z = read();
		v[x].push_back(edge{y, z});
		v[y].push_back(edge{x, z});
	}
	mx[0] = n + 1;
	all = n;
	get_root(0, 1);
	memset(minn, 0x3f, sizeof(minn));
	dfz(rt);
	printf("%d", (ans >= n ? -1 : ans));
}
2024/7/18 19:28
加载中...