zoukankan      html  css  js  c++  java
  • PAT Advanced 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 (≤) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N1 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

    我们这题可以用两次DFS,第一次DFS进行找图的连通分量,第二次DFS从第一次DFS的一个点进行寻找,找出最大的点

    #include "iostream"
    #include "set"
    #include "vector"
    using namespace std;
    int N, a, b;
    bool path[10100][10100] = {false};
    bool vis[10100] = {false};
    int max_height = -1;
    set<int> s;
    vector<int> vec;
    void dfs(int v, int height) {
        vis[v] = true;
        if(height > max_height) {
            max_height = height;
            vec.clear();
            vec.push_back(v);
        }else if(height == max_height) vec.push_back(v);
        for(int i = 1; i <= N; i++) 
            if(path[v][i] && !vis[i])
                dfs(i, height + 1);
    }
    int main() {
        scanf("%d", &N);
        for(int i = 1; i <= N - 1; i++) {
            scanf("%d%d", &a, &b);
            path[a][b] = true;
            path[b][a] = true;
        }
        int components = 0;
        // find components
        for(int i = 1; i <= N; i++) {
            if(vis[i] == false) {
                dfs(i, 1);
                components++;
            }
        }
        if(components > 1) 
            printf("Error: %d components
    ", components);
        else {
            // find max
            max_height = 0;
            fill(vis, vis + N + 10, false);
            for(auto x: vec) s.insert(x);
            dfs(vec[0], 1);
            for(auto x: vec) s.insert(x);
            for(auto x: s) printf("%d
    ", x);
        }
        return 0;
    }
  • 相关阅读:
    第二冲刺阶段第十四天
    第二冲刺阶段第十三天
    第二冲刺阶段第十二天
    第二冲刺阶段第十一天
    典型用户分析
    课后作业——搜狗输入法
    spring第二冲刺阶段第十五天
    spring第二冲刺阶段第十四天
    spring第二冲刺阶段第十三天
    spring第二冲刺阶段第十二天
  • 原文地址:https://www.cnblogs.com/littlepage/p/12762804.html
Copyright © 2011-2022 走看看