http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83468#problem/D
题意:给出一棵树,让你找出一个节点,使得所有点到这个节点的最大距离最小
分析:可以想到,若是找到这棵树的最大深度length,再除2,即是结果,若是length是奇数,ans+1; 也可以 (length+1)/2,不管奇数偶数。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
using namespace std;
#define maxn 100005
#define inff 1000000000
vector<int>v[maxn];
int f[maxn];
struct node
{
int x,s;
}tx,ty;
int l;
int bfs(int x)
{
queue<node>q;
int i,len,ans=-inff;
tx.x=x;
tx.s=0;
q.push(tx);
f[tx.x]=1;
while(!q.empty())
{
tx=q.front();
q.pop();
if(tx.s>ans)
{
ans=tx.s;
l=tx.x;
}
f[tx.x]=1;
len=v[tx.x].size();
for(i=0;i<len;i++)
{
ty.x=v[tx.x][i];
ty.s=tx.s+1;
if(f[ty.x]==0)
q.push(ty);
}
}
return ans;
}
int main()
{
int t,i,n,x,y;
cin>>t;
while(t--)
{
cin>>n;
for(i=0;i<maxn;i++)
v[i].clear();
for(i=1;i<n;i++)
{
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
memset(f,0,sizeof f);
int ans1=bfs(0);
memset(f,0,sizeof f);
int ans2=bfs(l);
cout<<(max(ans1,ans2)+1)/2<<endl;
}
return 0;
}