为什么不能求直径?
查看原帖
为什么不能求直径?
551870
consequence楼主2023/7/13 19:02

众所周知有个著名的结论,离树上的某一节点最远的点必然是直径的一个端点,那么我们为什么不能把直径的两个端点求出来后比较呢? 代码如下

#include <bits/stdc++.h>
#define fr first
#define sc second
#define int long long

using namespace std;

typedef pair<int, int> pii;
const int MAXN = 1e6 + 10;
vector<int> v[MAXN];
long long d1[MAXN], d2[MAXN];
int n, a, b;
long long ans1, ans2;
pii r1, r2;

int read()
{
	int x = 0; char ch = getchar();
	for (; !isdigit(ch); ch = getchar());
	for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
	return x;
}
void dfs1(int p, int fa, int dst)
{
	if (dst > r1.fr)
	{
		r1.fr = dst;
		r1.sc = p;
	}
	for (int i = 0; i < v[p].size(); ++i)
	{
		if (v[p][i] != fa) dfs1(v[p][i], p, dst + 1);
	}
}
void dfs2(int p, int fa, int dst)
{
	d1[p] = dst;
	ans1 += d1[p];
	if (dst > r2.fr)
	{
		r2.fr = dst;
		r2.sc = p;
	}
	for (int i = 0; i < v[p].size(); ++i)
	{
		if (v[p][i] != fa) dfs2(v[p][i], p, dst + 1);
	}
}
void dfs3(int p, int fa, int dst)
{
	d2[p] = dst;
	ans2 += d2[p];
	for (int i = 0; i < v[p].size(); ++i)
	{
		if (v[p][i] != fa) dfs3(v[p][i], p, dst + 1);
	}
}

signed main()
{
	cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
	n = read();
	for (int i = 1; i < n; ++i)
	{
		a = read();
		b = read();
		v[a].push_back(b);
		v[b].push_back(a);
	}
	r1.fr = -1;
	r2.fr = -1;
	dfs1(1, 0, 0);
	dfs2(r1.sc, 0, 0);
	dfs3(r2.sc, 0, 0);
	if (ans1 >= ans2) cout << r1.sc << endl;
	else cout << r2.sc << endl;
	return 0;
}

wa了最后一个点,求各位大佬帮忙看看哪里错了

2023/7/13 19:02
加载中...