一,题目
Description
给你一颗 N个点的边权均为1 的树,希望找到一个点u ,使得距离点u 最远的点最近
请输出距离点u 最远的点到点u 的距离。
Format
Input
第一行给出N
接下来N-1行,描述这个树
N<=1e5
Output
如题
Samples
输入数据 1
3
1 2
2 3
输出数据 1
1
二,思路
这道题很简单,看到题目就知道是求一棵树的半径,所以直接求出树的直径,再求树的直径/2向上取整的结果就行了。(因为在这棵树中边权都是1)
三,代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,maxn,maxk,u,v;
/*
pre[j]:对于第i条边来说,它的上一条边是哪一条边
now[x]:对于点x来说,最后一条描述它充当父结点的边是哪一条边
son[i]:在第i条边中,充当子结点的点是哪一个
*/
int eg,pre[100001],now[100001],son[100001];
void adeg(int u,int v)
{
pre[++eg] = now[u];
now[u] = eg;
son[eg] = v;
}
void dfs(int beg,int fa,int d)
{
if(d > maxn)
{
maxn = d;
maxk = beg;
}
for(int i = now[beg]; i; i = pre[i])
{
int v = son[i];
if(v == fa) continue;
dfs(v,beg,d + 1);
}
}
signed main()
{
cin>>n;
n--;
while(n--)
{
cin>>u>>v;
adeg(u,v);
adeg(v,u);
}
dfs(1,0,0);
dfs(maxk,0,0);
if(maxn % 2 == 0) cout<<maxn / 2;
else cout<<maxn / 2 + 1;
return 0;
}