蜜汁RE on #6,7求助
查看原帖
蜜汁RE on #6,7求助
108610
Dzhao楼主2021/3/7 10:50
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4e5 + 5, M = 8e5 + 5;
int n, ver[M], nxt[M], edge[M], h[N], tot, p[3], dis[3][N], mx, f[N], opt[N], cnt, mxd[3][N];
inline void add(int x, int y, int z) {ver[++tot] = y, edge[tot] = z, nxt[tot] = h[x], h[x] = tot;} 
void dfs1(int u, int fa, int k, int len) {
	if(len > mx) mx = len, p[k] = u;
	for(int i = h[u]; i; i = nxt[i]) {
		int v = ver[i], w = edge[i];
		if(v == fa) continue;
		dfs1(v, u, k, len + w);
	}
}
void dfs2(int u, int fa, int k) {
	mxd[k][u] = dis[k][u];
	for(int i = h[u]; i; i = nxt[i]) {
		int v = ver[i], w = edge[i];
		if(v == fa) continue;
		dis[k][v] = dis[k][u] + w;
		if(k == 0) f[v] = u;
		dfs2(v, u, k);
		mxd[k][u] = max(mxd[k][u], mxd[k][v]);
	}
}

signed main() {
	scanf("%lld", &n);
	for(int i = 1, x, y, z; i < n; i++) {
		scanf("%lld%lld%lld", &x, &y, &z);
		add(x, y, z), add(y, x, z);
	}
	dfs1(1, 0, 0, 0); dfs1(p[0], 0, 1, 0);
	dfs2(p[0], 0, 0); dfs2(p[1], 0, 1);
	printf("%lld\n", mx);
	int x = p[1];
	while(x != p[0]) {
		opt[++cnt] = x;
		x = f[x];
	}
	opt[++cnt] = p[0];
//	for(int i = 1; i <= cnt; i++) printf("%d ", opt[i]); puts("");
	int j1 = 1, j2 = cnt;
	for(int i = 1; i <= cnt; i++) {
		bool ok = 0;
		for(int j = h[opt[i]]; j; j = nxt[j]) {
			if(ver[j] != opt[i + 1] && ver[j] != opt[i - 1]) {
				if(mxd[1][ver[j]] - dis[1][opt[i]] == dis[1][opt[i]]) {
					ok = 1; break;
				}
			}
		}
		if(ok) j1 = i;
	}
	for(int i = cnt; i >= 1; i--) {
		bool ok = 0;
		for(int j = h[opt[i]]; j; j = nxt[j]) {
			if(ver[j] != opt[i + 1] && ver[j] != opt[i - 1]) {
				if(mxd[0][ver[j]] - dis[0][opt[i]] == dis[0][opt[i]]) {
					ok = 1; break;
				}
			}
		}
		if(ok) j2 = i;
	}
//	printf("%lld %lld\n", j1, j2);
	printf("%lld\n", max(cnt - 1 - (j1 - 1) - (cnt - j2), 0ll));
	return 0;
}

数组开大了试了一下也没用

2021/3/7 10:50
加载中...