• 1021. Deepest Root (25)


    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive integer N (<=10000) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N-1 lines follow, each describes an edge by given the two adjacent nodes' numbers.

    Output Specification:

    For each test case, print each of the deepest roots in a line. If such a root is not unique, print them in increasing order of their numbers. In case that the given graph is not a tree, print "Error: K components" where K is the number of connected components in the graph.

    Sample Input 1:

    5
    1 2
    1 3
    1 4
    2 5
    

    Sample Output 1:

    3
    4
    5
    

    Sample Input 2:

    5
    1 3
    1 4
    2 5
    3 4
    

    Sample Output 2:

    Error: 2 components
    #include<cstdio>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int maxn = 10010;
    
    vector<int> G[maxn];
    int father[maxn];
    bool isRoot[maxn];
    
    int findFather(int x){
        int a = x;
        while(x != father[x]){  //找到x的根节点 
            x = father[x];
        }
        while(a != father[a]){   //路径压缩 
            int z = a;
            a = father[a];
            father[z] = x;
        }
        return x;
    }
    
    int calBlock(int n){    //查图中几个连通 
        int block = 0;   //未初始化 
        for(int i = 1; i <= n; i++){        
            isRoot[findFather(i)] = true;        
        }
        for(int i = 1; i <= n; i++){
            block += isRoot[i];
        }
        return block;
    }
    
    void Union(int a,int b){
        int faA = findFather(a);
        int faB = findFather(b);
        if(faA != faB) father[faA] = faB;
    }
    void init(int n){
        for(int i = 1; i <= n; i++){
           father[i] = i;        
        }
    }
    int maxH = 0;
    vector<int> temp,ans;//临时存放最长结点
    void DFS(int u,int depth,int pre) {//当前访问结点,结点深度,父节点
        if(depth > maxH){
            temp.clear();
            temp.push_back(u);
            maxH = depth;
        }else if(depth == maxH){
            temp.push_back(u);
        }
        for(int i = 0; i < G[u].size(); i++){
            if(G[u][i] == pre) continue;
            DFS(G[u][i],depth+1,u);
        }
    } 
    
    
    int main(){
        int n,u,v;
        int i;
        scanf("%d",&n);
        init(n);
        for(i = 1; i < n; i++){   //五个顶点,四条边。 多了一个输入 
            scanf("%d%d",&u,&v);
            G[u].push_back(v);
            G[v].push_back(u);
            Union(u,v);
        }
        int block = calBlock(n);
        if(block != 1) printf("Error: %d components",block);
        else{
            DFS(1,1,-1);
            ans = temp;
            DFS(ans[0],1,-1);
            for(i = 0; i < temp.size(); i++){
                ans.push_back(temp[i]);
            }
            sort(ans.begin(),ans.end());   //默认递增
            printf("%d
    ",ans[0]);
            for(i = 1; i < ans.size(); i++){
                if(ans[i] != ans[i - 1]){
                    printf("%d
    ",ans[i]);
                }
            } 
        }
       
        return 0;
    } 
  • 相关阅读:
    vmodel.lazy详解
    import Vue from 'vue'如何解释?
    ubuntu安装deb文件包
    vue安装
    多线程和多进程的区别
    SLH(Location Sensitive Hash)学习
    hadoop学习笔记(一)简介
    [转]关于协同过滤的好文章
    Linear Regression练习
    regularized 线性回归练习
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/8575876.html
Copyright © 2020-2023  润新知