题意 :寻找书中的最长路径。
思路 : 随便找一点,找到其最远点的最远点即可 ,两次DFS或两次BFS即可。
代码 :
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff
vector<int>adj[100010];
int n,vis[100010],degree[100010],d[100010],ans = 0;
void init(){
int i;
for(i=1;i<=n;i++){
adj[i].clear();
degree[i] = 0;
}
}
void dfs(int x,int temp){
int i,num;
num = degree[x];
for(i=0;i<num;i++){
int t = adj[x][i] ;
if(!vis[t]){
vis[t] = 1;
d[t] = d[x] + 1 ;
dfs(t,temp+1);
}
}
}
int main(){
int i,j,a,b;
while(scanf("%d",&n) == 1){
init();
ans = 0;
for(i=1;i<n;i++){
scanf("%d%d",&a,&b);
adj[a].push_back(b);
adj[b].push_back(a);
degree[a] ++ ;
degree[b] ++ ;
}
memset(vis,0,sizeof(vis));
d[i] = 0;
vis[i] = 1;
dfs(i,0);
ans = 0;
int k;
for(i=1;i<=n;i++)
if(d[i]>ans){
ans = d[i];
k = i;
}
d[k] = 0;
memset(vis,0,sizeof(vis));
vis[k] = 1;
dfs(k,0);
for(i=1;i<=n;i++)
ans = ans > d[i] ? ans : d[i] ;
printf("%d
",ans);
}
return 0;
}