http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=24028

其实bfs 和dfs 两个的原理是一样的,都是找到最深的,不过都需要两遍

第一次找到深度最深的,第二次以深度最深的 再找最深的

View Code
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
#define inf ~0U>>1
#define maxn 100000
using namespace std;
int n;
vector<int>node[maxn];
pair<int,int>ans;
int visit[maxn];
void init()
{
    int a,b;
    for(int i=0;i<n;i++)
        node[i].clear();
    for(int i=1;i<n;i++)
    {
        cin>>a>>b;
        node[a].push_back(b);
        node[b].push_back(a);
    }
}
void bfs(int root)
{
    queue<pair<int,int> >q;//带有两个属性的队列
    q.push(make_pair(root,0));//首先根入队
    ans.second=0;
    memset(visit,0,sizeof(visit));
    visit[root]=1;
    while(!q.empty())
    {
        pair<int,int>temp=q.front();
        q.pop();
        if(temp.second>ans.second)
        {
            ans.second=temp.second;
            ans.first=temp.first;
        }
        for(int i=0;i<node[temp.first].size();i++)
        if(!visit[node[temp.first][i]])//没有访问入队
        {
            visit[node[temp.first][i]]=1;
            q.push(make_pair(node[temp.first][i],temp.second+1));
        }
    }
}

int main()
{
    int test;
    for(cin>>test;test;test--)
    {
        cin>>n;
        init();
        bfs(0);//两次bfs,第一次假设0为根,寻找深度最深的点
        bfs(ans.first);
//第二次,以深度最深的点位根,在寻找深度最深的点
        if(ans.second%2)
            cout<<ans.second/2+1<<endl;//偶数答案一半加1
        else
            cout<<ans.second/2<<endl;//奇数答案一半
    }
    return 0;
}
posted on 2012-08-31 08:58  一把刷子  阅读(209)  评论(0编辑  收藏  举报