当前位置: 首页 > news >正文

PAT甲级(Advanced Level) Practice 1021 Deepest Root

原题

1021 Deepest Root - PAT (Advanced Level) Practice

题目大意

给定一个连通且无环的图(即树),树的高度取决于根节点的选择。请找出能使树的高度最大的所有根节点(称为“最深根”)。若给定的图不是树(即不连通),需输出连通分量的数量。

解题思路

先找连通分量的数量,利用bfs遍历所有点,标记已经遍历的点,调用函数bfs的次数就是连通分量的个数。

若为树,利用两次bfs和无序集合unordered_set来保存使树深度最大的点,只用一次bfs有可能遇到如图情况:假设我们从G点开始遍历,M点就不会进入答案,因此我们先遍历一次,找到最远的为B,再从B开始遍历,找到M。

代码(c++)

#include <bits/stdc++.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <unordered_set>

using namespace std;

const int N = 10010;

int n;
vector<vector<int>> graph(N);          // 模拟邻接表
vector<bool> visited(N, false);

vector<int> bfs(int start, const vector<vector<int>>& graph, int n) {
    vector<int> depth(n + 1, -1);      // 记录每个点的深度
    queue<int> q;
    q.push(start);
    depth[start] = 0;
    int max_depth = 0;                 // 动态记录最深的深度
    
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int v : graph[u]) {
            if (depth[v] == -1) {
                depth[v] = depth[u] + 1;
                max_depth = max(max_depth, depth[v]);
                q.push(v);
            }
        }
    }
    
    vector<int> res;
    for (int i = 1; i <= n; ++i) {
        if (depth[i] == max_depth) {
            res.push_back(i);
        }
    }
    return res;
}

int main() {
    cin >> n;
    for(int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }

    int components = 0;
    for (int i = 1; i <= n; ++i) {
        if (!visited[i]) {
            components++;
            queue<int> q;
            q.push(i);
            visited[i] = true;
            while (!q.empty()) {
                int u = q.front();
                q.pop();
                for (int v : graph[u]) {
                    if (!visited[v]) {
                        visited[v] = true;
                        q.push(v);
                    }
                }
            }
        }
    }
    if(components == 1) {
        // 两次遍历找到所有最深的点
        vector<int> Y = bfs(1, graph, n);                
        vector<int> Z = bfs(Y[0], graph, n);
    
        unordered_set<int> deepest;
        for (int y : Y) deepest.insert(y);
        for (int z : Z) deepest.insert(z);
        vector<int> ans(deepest.begin(), deepest.end());
        sort(ans.begin(), ans.end());
    
        for (int node : ans) {
            cout << node << endl;
        }
    }
    else cout << "Error: "<< components << " components";
}

相关文章:

  • 通达信软件+条件选股+code
  • Atcoder ABC397-D 题解
  • L1-093 猜帽子游戏
  • 如何将一个项目推送到gitlab
  • 注意力机制:让AI拥有黄金七秒记忆的魔法--(自注意力)
  • 机器学习——正则化、欠拟合、过拟合、学习曲线
  • Webpack 前端性能优化全攻略
  • 【实用技巧】如何优雅的批量保存网页快照?
  • CTF题目《SSRFMe》(网鼎杯 2020 玄武组)WriteUp
  • Qlik Sense New Install with Restore
  • 【开源代码解读】AI检索系统R1-Searcher通过强化学习RL激励大模型LLM的搜索能力
  • Word 小黑第36套
  • 探索Maas平台与阿里 QWQ 技术:AI调参的魔法世界
  • 在PowerShell脚本中编辑appsettings.json
  • 鸿蒙(OpenHarmony)开发实现 息屏/亮屏 详情
  • Vue本地开发调试使用Proxy实现接口代理配合Nginx实现瓦片png文件代理,实现本地模拟GIS开发环境
  • 《解锁Netlify:静态网站托管》:此文为AI自动生成
  • 探索 Trossen AI:从 Aloha到智能机器人平台的进化之路
  • 大数据学习(69)- OLAP和OLTP
  • list常用接口及模拟实现
  • 普京:“胜利日停火”已开始生效
  • 青年与城市共成长,第六届上海创新创业青年50人论坛将举办
  • 深圳一购房者交首付后迟迟无法签合同,澎湃介入后开发商承诺退款
  • 为什么有的人闻到烟味,会咳嗽、胸闷?别再伤害身边的人
  • 马上评|子宫肌瘤惊现男性患者,如此论文何以一路绿灯?
  • 江南华南较强降雨扰返程,北方大部需防风沙