WA on #11
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n,m,s,t,s1,s2,t1,t2;
int depth[maxn];
bool flag,vis[maxn],vis_[maxn];
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<3) + (s<<1) +ch-'0',ch=getchar();
return s*w;
}
struct sm
{
int v,next;
}a[maxn * 2];
int head[maxn],cnt;
void add(int u,int v)
{
a[++cnt].v = v;
a[cnt].next = head[u];
head[u] = cnt;
}
void dfs(int u,int fa)
{
int son = 0;
depth[u] = depth[fa] + 1;
for(int i = head[u];i;i = a[i].next)
{
int v = a[i].v;
if(v==fa)continue;
dfs(v,u);
son++;
}
if(son >= 2 && depth[u] > depth[s] && !flag)s = u;
if(son >= 2 && depth[u] > depth[t] && flag)t = u;
}
void dfs_first(int u,int fa)
{
for(int i = head[u];i;i = a[i].next)
{
int v = a[i].v;
if(v==fa)continue;
dfs_first(v,u);
vis[u] = vis[u]|vis[v];
}
}
void dfs_second(int u,int fa)
{
depth[u] = depth[fa] + 1;
if(depth[u] > depth[s1] && flag)s1 = u;
if(depth[u] > depth[t1] && !flag)t1 = u;
for(int i = head[u];i;i = a[i].next)
{
int v = a[i].v;
if(v==fa||vis[v]||vis_[v])continue;
dfs_second(v,u);
}
}
void dfs_third(int u,int fa)
{
for(int i = head[u];i;i = a[i].next)
{
int v = a[i].v;
if(v==fa)continue;
dfs_third(v,u);
vis_[u] = vis_[u]|vis_[v];
}
}
void pre()
{
dfs(n,0);flag = 1;
//printf("\n");
dfs(s,0);//找公共部分
vis[t] = 1;
dfs_first(s,0);//标记公共部分
flag = 1;
dfs_second(s,0);//从s开始找第一条长链
vis_[s1] = 1;
dfs_third(s,0);//标记从开始s的第一条长链
flag = 0;
dfs_second(t,0);//从t开始找第一条长链
vis_[t1] = 1;
dfs_third(t,0);//标记从t开始的第一条长链
printf("%d %d\n",s1,t1);
s1 = 0,t1 = 0;
flag = 1;
dfs_second(s,0);
flag = 0;
dfs_second(t,0);
printf("%d %d",s1,t1);
}
signed main()
{
n = read();
int x,y;
for(int i = 1;i < n;i++)
{
x = read(),y = read();
add(x,y);
add(y,x);
}
pre();
return 0;
}
求hack数据