众所周知有个著名的结论,离树上的某一节点最远的点必然是直径的一个端点,那么我们为什么不能把直径的两个端点求出来后比较呢? 代码如下
#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了最后一个点,求各位大佬帮忙看看哪里错了