题意:给你一颗树,你可以选择任意结点为根,求树的高度的最小值
想法:求树上的最长距离,答案就是(最长距离/2)向上取整
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
inline int input()
{
int ret=0;
bool IsN=0;
char c;
c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') IsN=1;
c=getchar();
}
while(c>='0'&&c<='9')
{
ret=ret*10+c-'0',c=getchar();
}
return IsN?-ret:ret;
}
vector<int>e[1000000];
bool vis[1000000];
int n;
int a,b;
inline void dfs(int now,int now_l,int &end,int &len)
{
if(now_l>len)
{
end=now,len=now_l;
}
for(int i=0;i<e[now].size();i++)
{
int x=e[now][i];
if(!vis[x])
{
vis[x]=1;
dfs(x,now_l+1,end,len);
}
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++) e[i].clear(),vis[i]=0;
for(int i=1;i<n;i++)
{
a=input(),b=input();
e[a].push_back(b);
e[b].push_back(a);
}
int start=0,end=0,len=0;
vis[0]=1;
dfs(0,0,end,len);
len=0;
memset(vis,0,sizeof(vis)),vis[end]=1;
dfs(end,0,start,len);
printf("%d\n",len/2+(len%2));
}
return 0;
}