【图论】拓补排序 - 邻接表

这篇具有很好参考价值的文章主要介绍了【图论】拓补排序 - 邻接表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目:310. 最小高度树

题目描述

【图论】拓补排序 - 邻接表,基础算法练习,图论,算法

代码与注释

func findMinHeightTrees(n int, edges [][]int) (ans []int) {
    if n == 1 {
        return []int{0}
    }
    g := make([][]int, n)
    degree := make([]int, n) // 记录每个节点的度(之相连的边的数量)
    for _, e := range edges { // 构建邻接表
        a, b := e[0], e[1]
        g[a] = append(g[a], b)
        g[b] = append(g[b], a)
        degree[a]++
        degree[b]++
    }
    q := []int{} // 通过队列存储度为 1 的节点(叶子节点)
    for i, d := range degree {
        if d == 1 {
            q = append(q, i) // 存储所有叶子节点
        }
    }
    for len(q) > 0 { // 把所有叶子节点剥离到最后一层,剩下的节点就可以作为最小高度树的根节点了
        ans = []int{} // 清空 ans
        for i := len(q); i > 0; i-- { // 把当前层的叶子节点都剥离
            a := q[0] // 获取队列中的叶子节点
            q = q[1:]
            ans = append(ans, a)
            for _, b := range g[a] { // 遍历 a 相邻的节点
                degree[b]-- // 相邻节点的度-1
                if degree[b] == 1 { // 新的叶子节点
                    q = append(q, b)
                }
            }
        }
    }
    return ans // 最后剩下的节点就是最小高度树的根
}

主要学习如何记录每个节点的度文章来源地址https://www.toymoban.com/news/detail-850232.html

到了这里,关于【图论】拓补排序 - 邻接表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法基础-学习-23-图之邻接矩阵与邻接表

    目录 一、定义和术语 二、存储结构 1、邻接矩阵 1.1、邻接矩阵优点 1.2、邻接矩阵缺点 2、邻接表 3、邻接矩阵和邻接表的区别和用途 3.1、区别 3.2、用途 三、宏定义 四、结构体定义 1、邻接矩阵 2、邻接表 3、网数据类型(造测试数据) 五、函数定义 1、使用邻接矩阵创建无

    2024年02月14日
    浏览(35)
  • 【C++算法模板】图论-拓扑排序,超详细注释带例题

    推荐视频链接:D01 拓扑排序 给定一张 有向无环图 ,排出所有顶点的一个序列 A A A 满足:对于图中的每条有向边 ( x , y ) (x,y) ( x , y ) , x x x 在 A A A 中都出现在 y y y 之前,则称 A A A 是该图的顶点的一个拓扑序 拓扑排序 可以判断有向图中是否有环,可以生成拓扑序列 对于下

    2024年04月15日
    浏览(41)
  • 图论01-【无权无向】-图的基本表示-邻接矩阵/邻接表

    https://github.com/Chufeng-Jiang/Graph-Theory/tree/main/src/Chapt01_Adjacency 代码有删减 代码有删减 只需要改动一行 adj = new TreeSet[V]; //构造邻接表, V行,V个LinkedList 代码有删减

    2024年02月07日
    浏览(44)
  • 图论之邻接表

    路径规划算法综述 图论基础介绍 图论之邻接矩阵 目录  路径规划系列文章目录 一、邻接表 二、邻接表实现 2.1 链式前向星实现 2.2 链表实现 三、总结         由于对于稀疏图来说,使用邻接矩阵进行存储显然会使得空间利用率较低,因此利用邻接表来存储图,可以克服

    2024年02月04日
    浏览(41)
  • 图论之邻接矩阵

    路径规划算法综述 图论基础介绍 目录 路径规划系列文章目录 一、图的存储方式介绍 二、邻接矩阵介绍 三、邻接矩阵实现 四、总结          图的结构比较复杂,是非线性结构,任意两点都可能存在联系,相对来说存储方法较多。目前主要有: 邻接矩阵表示法 邻接表表

    2024年02月06日
    浏览(35)
  • 图论——邻接矩阵之无向网

    在此之前,我们需要先理清图和网的区别 1.图G:有两个集合,边集V和点集E【点集用来存放各个顶点,边集用来存放各条边来表示关联两点的联系】 2.权值:即即两顶点之间互相往来需要花费的代价或消耗 3.网:带权值的图 所谓邻接矩阵,即用矩阵排布的方式来构建两点之间

    2024年02月05日
    浏览(41)
  • ⌈算法进阶⌋图论::拓扑排序(Topological Sorting)——快速理解到熟练运用

    目录  一、原理 1. 引例:207.课程表  2. 应用场景 3. 代码思路 二、代码模板 三、练习 1、210.课程表Ⅱ🟢 2、2392.给定条件下构造举证🟡 3、310.最小高度树🟡 4、 2603.收集树中金币 🔴 1. 引例:207.课程表 就如大学课程安排一样,如果要学习数据结构与算法、机器学习这类课程

    2024年02月11日
    浏览(49)
  • 数据结构算法练习 插入排序 冒泡排序

    插入排序 代码如下  package main import \\\"fmt\\\" func main() {     a := []int{4, 5, 6, 1, 3, 2}         b := insert(a)     for i := 0; i len(b); i++ {         fmt.Println(b[i])     } } func insert(a []int) []int {     if len(a) = 1 {                   如果数组长度小于等于1 不用排序直接返回          retur

    2024年02月08日
    浏览(58)
  • 第五章 图论 邻接表存图

    2024年02月03日
    浏览(37)
  • 第五章 图论 邻接矩阵存图

    dfs bfs

    2024年01月19日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包