题意:n个点n-1条边的树,找出三个点使得三个点两两之间边的并集最大.
首先找出树的直径..然后遍历一遍其他点
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 7;
int n;
vector<int>g[maxn];
int dist[maxn];
int sum[maxn];
int bfs(int kk)
{
memset(dist, 0, sizeof(dist));
dist[kk] = 0;
queue<int>q;
q.push(kk);
int now;
while (!q.empty())
{
now = q.front();
q.pop();
for (auto x : g[now])
{
if (x!=kk&&!dist[x])
{
dist[x] = dist[now] + 1;
q.push(x);
}
}
}
return now;
}
int main()
{
while (cin >> n)
{
vector<int>a;
for (int i = 1; i < n; i++)
{
int x, y;
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
int x = bfs(1);
int y = bfs(x);
//cout << x << " " << y << endl;
for (int i = 1; i <= n; i++)sum[i] = dist[i] + dist[y];
bfs(y);
int ma = -1, k = 0;
for (int i = 1; i <= n; i++)
{
if (i != x && i != y && sum[i] + dist[i] > ma)
{
ma = sum[i] + dist[i];
k = i;
}
}
cout << ma / 2 << endl;
cout << x << " " << y << " " << k << endl;
}
}