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; }