您的位置:首页 > 其它

Time to live

2012-08-31 08:58 218 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: