首页 > 其他分享 >基环树学习指南

基环树学习指南

时间:2023-10-08 12:55:05浏览次数:35  
标签:学习指南 基环 树枝 基环树 edges 节点 deg

基环树学习指南

前置芝士

一个图中包含n个点n条边,且图中只存在一个环,这样的图被称为基环树(环套树)。

基环树比树多了一条边,从而形成了一个环。基环树可以看做以坏点为根的一颗颗子树构成。

三大分类

基环无向树

基环内向树(每个点有且只有一条出边)

基环外向树(每一个点只有一条入边)

[解题步骤]

深搜找环。

断环成树,对树深搜计算。

保证这 (n) 个点 (n) 条边构成的是一个连通图时有唯一环。

如果图不连通但是每个联通块点数都等于边数时,这个图就是一个基环树森林。

基环内向树访问计数

[problem description]

现有一个有向图,其中包含 n 个节点,节点编号从 0n - 1 。此外,该图还包含了 n 条有向边。

给你一个下标从 0 开始的数组 edges ,其中 edges[i] 表示存在一条从节点 i 到节点 edges[i] 的边。

  • 你从节点 x 开始,通过边访问其他节点,直到你在此过程中再次访问到之前已经访问过的节点。
  • 返回数组 answer 作为答案,其中 answer[i] 表示如果从节点 i 开始执行该过程,你可以访问到的不同节点数。
  • 2<=n<= 10^5

[solved]

(1)反向建边,更有利于将树枝删去。

(2)拓扑排序,剪掉 图上的所有树枝,deg 值为 1 的点必定在基环上,为 0 的点必定在树枝上。

(3)dfs,需要考虑节点不在一个连通块里。

[python]

class Solution:
    def countVisitedNodes(self, edges: List[int]) -> List[int]:
        n=len(edges)
        rg=[[]for _ in range(n)] #反图
        deg=[0]*n #统计出度
        for x,y in enumerate(edges):
            rg[y].append(x)
            deg[y]+=1
        # 拓扑排序,剪掉 g 上的所有树枝
        # 拓扑排序后,deg 值为 1 的点必定在基环上,为 0 的点必定在树枝上
        q=deque()
        for i in range(n):
            if deg[i]==0:
                q.append(i)
        while q:
            u=q.popleft()
            v=edges[u]
            deg[v]-=1
            if deg[v]==0:  # 树枝上的点在拓扑排序后,入度均为 0
                q.append(v)
        ans=[0]*n
         # 在反图上遍历树枝
        def dfs(x:int,depth:int)->None:
            ans[x]=depth
            for v in rg[x]:
                if deg[v]==0:
                    dfs(v,depth+1)   
        for i,x in enumerate(deg):
            if x<=0:
                continue
            ring=[]
            v=i
            while True:
                deg[v]=-1   # 将基环上的点的入度标记为 -1,避免重复访问
                ring.append(v)  # 收集在基环上的点
                v=edges[v]
                if v==i:
                    break
            for i in ring:
                dfs(i,len(ring))  # 为方便计算,以 len(ring) 作为初始深度
        return ans

标签:学习指南,基环,树枝,基环树,edges,节点,deg
From: https://www.cnblogs.com/taotao123456/p/17747841.html

相关文章

  • 骑士:基环树
    https://www.bilibili.com/video/BV1Aa411Q7qp/?spm_id_from=333.999.0.0&vd_source=23dc8e19d485a6ac47f03f6520fb15c2董老师讲的很清楚https://www.luogu.com.cn/problem/P2607 思路:1、深搜找环2、断环成树,对树深搜计算(断边:标记端点或者标记边)O(N)单向边://LuoguP2......
  • 【基环树 | 题解】P5022 [NOIP2018 提高组] 旅行
    前言一日知基环树弱,固补题。关于基环树基环树定义一个环,环上每个点都有一颗以该点为根的树,如下图为一棵基环树关于基环树常规思路通常来说基环树常规思路是先处理环上树的结果,后通过树的结果来处理换上结果。具体处理方式依照题目来定。然而只是通常来说因为基环树的问......
  • 10.4 国庆 环形dp与基环树笔记
    1.知识点环形dp环形dp的概念•环形dp与基环树在许多环形结构的问题中,我们可以在环中从某个位置把环断开,把这个环变成线性的,然后进行\(dp\)等操作。•把能通过上述操作解决的环形问题称作"可拆解的环形问题"。环形dp的两种策略•第一次在任意位置把环断开成链,按照......
  • LeetCode 周赛上分之旅 #49 再探内向基环树
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • 【学习笔记】(28) 基环树
    首先,严格地讲,基环树不是树,它是一张有\(n\)个节点、\(n\)条边的图。介绍无向图上的基环树有向图上的基环树内向树出度为1外向树入度为1流程找到唯一的环;对环之外的部分按照若干棵树处理;考虑与环一起计算。找环从任意一点开始搜索;每次拓展到的点涂为灰色,回......
  • 《Python数据分析基础教程:NumPy学习指南.第2版》高清高质量PDF电子书+源码
    罕见的NumPy中文入门教程,Python数据分析首选从最基础的知识讲起,手把手带你进入大数据挖掘领域囊括大量具有启发性与实用价值的实战案例下载:https://pan.quark.cn/s/730b594117c0......
  • 基环树问题 解题报告
    luoguP5022旅行题意对于60%的数据,给一棵树,求一条字典序最小的Hamilton路径;对于40%的数据,给一颗基环树,求一条字典序最小的Hamilton路径。分析前向星存图,对于每个点的出边排序,从1开始dfs一遍即可过60%数据;对于基环树,由于Hamilton路径在树上必然有一条边不经过,而这条边必然......
  • 初学者如何高效的学习Flutter?这份快速入门Flutter学习指南,拿走不谢
    什么是FlutterFlutter是Google推出并开源的移动端开发框架,主打跨平台、高保真、高性能。开发者可以通过Dart语言开发App,一套代码可以同时运行在iOS和Android平台。2018年12月,Google发布Flutter1.0。从那时候开始,Flutter以迅雷不及掩耳之势,迅速崛起,并稳固了其在市场上......
  • 代码源 - 基环树
    ZJOI2008骑士自己写的时候建的是\(dls\)的反图,想的是基环树不是要保证每个点的出度为\(1\),就选择每个点向仇恨点连接一条有向边.这种情况下如果记录每一个点出度指向哪,那么在找环的时候不一定能找到,因为图上带环的话要根据入度点找环(画图理解)如果记录入度......
  • 太爆了!阿里最新出品2023版JDK源码学习指南,Github三天已万赞
    近后台收到很多粉丝私信,说的是程序员究竟要不要去读源码?当下行情,面试什么样的薪资/岗位才会被问到源码?对此,我的回答是:一定要去读,并且要提到日程上来!据不完全统计,现在市面上不管是初级,中级,还是高级岗,面试的时候都有可能会问到源码中的问题,它已经成为程序员常规必备的一个技术点。如......