• PAT(Advanced Level)A1021. Deepest Root


    题意

    找到一个点,使得以它为根结点的树最高。如果不唯一,按照结点的数字升序排列。如果不存在,就输出连通块个数

    思路

    • 首先先统计一下连通块个数,如果大于1个,那么图不连通,不会构成树
    • 高度最高的树,按照我的理解就是用DFS,看谁能递归到最深的层数。用一个数组ans保存所有点的最大深度,最后进行比较的时候输出

    代码

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<map>
    using namespace std;
    const int MAXV = 10010;
    vector<int> adj[MAXV];
    int ans[MAXV];
    bool vis[MAXV];
    int nodes, blocks;
    int cur_level;
    void dfs(int u, int depth)
    {
        vis[u] = true;
        for(int i=0;i<adj[u].size();i++)
        {
            int ta = adj[u][i];
            if(!vis[ta])
                dfs(ta, depth + 1);
        }
        if(depth > cur_level)   cur_level = depth;	//到最深处返回的时候进行比较
        return;
    }
    
    void dfs_travel()
    {
        
        for(int i=1;i<=nodes;i++)   //每次从一个新的顶点出发进行遍历
        {
            if(!vis[i])
            {
                dfs(i, 0);
                blocks++;
            }
        }
    }
    int get_blocks()
    {
        memset(vis, false, sizeof(vis));
        vis[0] = true;
        blocks = 0;
        dfs_travel();
        return blocks;
    }    //先看有几个连通块
    int main()
    {
        scanf("%d", &nodes);
        int u, v;
        for(int i=0;i<nodes-1;i++)
        {
            scanf("%d %d", &u, &v);
            adj[u].emplace_back(v);
            adj[v].emplace_back(u);
        }
        get_blocks();
        if(blocks > 1)  //>1个连通块
        {
            printf("Error: %d components
    ", blocks);
        }else{    //确保是树之后再对每个点来一次DFS
            for(int i=1;i<=nodes;i++)
            {
                memset(vis, false, sizeof(vis));
                cur_level = 0;
                dfs(i, 0);
                ans[i] = cur_level;
            }
            int max_value = -1;
            for(int i=1;i<=nodes;i++)
                if(ans[i] > max_value)
                    max_value = ans[i];
            for(int i=1;i<=nodes;i++)
            {
                if(ans[i] == max_value)
                    cout << i << endl;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    JavaEE——Struts(1)--Filter作为MVC的控制器 配置Struts2环境
    折叠菜单--实现左边目录,右边显示
    转载--竖向折叠菜单
    pest错误笔记
    JavaWeb--JQuery中的$(function())
    codeforces 440C. One-Based Arithmetic 解题报告
    codeforces 399B. Red and Blue Balls 解题报告
    codeforces 445B. DZY Loves Chemistry 解题报告
    2013级新生程序设计基础竞赛-正式赛 F 异或最大值 解题报告
    codeforces 441C. Valera and Tubes 解题报告
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/13721964.html
Copyright © 2020-2023  润新知