• 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;
    }
    
  • 相关阅读:
    Python-产生随机长度的密码
    Python-双色球
    Python-产生手机号码
    Word操作笔记
    1035 最长的循环节
    B. Recover the String
    uva11752 The Super Powers
    UVA11754
    GCD
    D. Persistent Bookcase(Codeforces Round #368 (Div. 2))
  • 原文地址:https://www.cnblogs.com/jxgapyw/p/4814900.html
Copyright © 2020-2023  润新知