hiho 1050 树中的最长路 (树的直径)

题意 :寻找书中的最长路径。
思路 : 随便找一点,找到其最远点的最远点即可 ,两次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;
}
原文地址:https://www.cnblogs.com/jxgapyw/p/4814900.html