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

寻找树的中心(重心)

题目:

思路:

“剥洋葱”:每次剥掉一层叶子结点,直到最后剩余不多于2个节点,这些节点就是树的中心(重心)。

解释:

1、根据图论的知识可以知道,一颗树的中心(重心)至多有两个

2、叶子结点对于树的“半径”贡献最大,逐层剥离叶子结点可以逼近中心(重心)

代码:

#include<iostream>
#include<vector>
#include<queue>
#include<utility>
using namespace std;vector<int> findMinHeightTrees(int n, const vector<pair<int, int>>& edges)
{if (n == 1) return { 0 };//只有一个节点//1、构建邻接表,度数表vector<vector<int>> adj(n);vector<int> degree(n, 0);for (auto& e : edges){int u = e.first;int v = e.second;adj[u].push_back(v);adj[v].push_back(u);degree[u]++;degree[v]++;}//2、把所有叶子结点入队queue<int> q;for (int i = 0; i < n; i++)if (degree[i] == 1)q.push(i);//3、迭代“剥洋葱”,直至剩≤2个点int remaining = n;while (remaining > 2)//每次删完一圈叶子才会来到判断部分{int sz = q.size();remaining -= sz;for (int i = 0; i < sz; i++){int u = q.front();q.pop();//删除u,并更新邻居的度for (int v : adj[u])if (--degree[v] == 1)q.push(v);}}//4、队列中的节点即为最小高度树的根vector<int> roots;while (!q.empty()){roots.push_back(q.front());q.pop();}return roots;
}int main()
{int n;cin >> n;vector<pair<int, int>> edges(n - 1);for (int i = 0; i < n - 1; i++){cin >> edges[i].first >> edges[i].second;}vector<int> roots = findMinHeightTrees(n, edges);cout << "最小高度树的根节点有:";for (int x : roots)cout << x << " ";cout << endl;return 0;
}

 运行结果:

相关文章:

  • 湖北理元理律师事务所:科学债务管理模型构建实录
  • 【JDBC】JDBC常见错误处理方法及驱动的加载
  • C语言:在 Win 10 上,g++ 如何编译 gtk 应用程序
  • linux网络内核的核心函数作用和简介
  • 手写tomcat:基本功能实现(3)
  • Java IO流进阶实战详解(含文件读写、拷贝、加密、字符集)
  • R语言空间数据处理入门教程
  • BC 范式与 4NF
  • AI日报 - 2024年5月17日
  • 【React中虚拟DOM与Diff算法详解】
  • 日期数据渲染转换问题
  • Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记
  • C++高级应用(1)-类型擦除(Type Erasure)和模板特化(Template Specialization)详解
  • aksharetools:大模型智能体框架agno可直接获取A股金融数据
  • [Mac] 开发环境部署工具ServBay 1.12.2
  • React Hooks 必须在组件最顶层调用的原因解析
  • 【机器人】复现 WMNav 具身导航 | 将VLM集成到世界模型中
  • Spring Boot 项目的计算机专业论文参考文献
  • 创建react工程并集成tailwindcss
  • React中useState中更新是同步的还是异步的?
  • 佛山网站建设天博/李江seo
  • 做网站需要的设备/网站改进建议有哪些
  • 网站过度优化/神马站长平台
  • 网站建设中英文表述/谷歌搜索引擎入口手机版
  • 保定网站制作套餐/腾讯企点app下载安装
  • 微网站的案例/百度投流