拓扑排序的BFS做法

2024.10.9华为笔试题解 bfs求最短路问题。 阅读详情

无论是 directed 还是 undirected Graph,其 BFS 的核心都在于 "indegree",处理顺序也是从 indegree 最小的开始。

算法如下:

1) 先用一个 HashMap 统计下所有节点的 indegree; 

(值越高的,在拓扑排序中位置也就越靠后,因为还有 N = current indegree 的 parent node 们没有处理完。)

2) 因此在循环最开始,我们把所有 indegree = 0作为(均不在 hashmap中) (1)BFS 的起点(进queue) (2)加到 list 中。

3) 在 BFS 过程中,我们依次取出队列里 node 的 neighbors,并把他们的 indegree减去1,代表其 parent node 已经被处理完,有效 indegree 减少。

4) 当减去1之后node 的 indegree 已经是 0 (1)BFS 的起点(进queue) (2)加到 list 中。

public class Solution {
    /**
     * @param graph: A list of Directed graph node
     * @return: Any topological order for the given graph.
     */    
    public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
        // write your code here
        ArrayList<DirectedGraphNode> list = new ArrayList<DirectedGraphNode>();


        // Key : node
        // Value : current in-degree count
        HashMap<DirectedGraphNode, Integer> map = new HashMap<>();
        for(DirectedGraphNode node : graph){
            for(DirectedGraphNode neighbor : node.neighbors){
                if(!map.containsKey(neighbor)){
                    map.put(neighbor, 1);
                } else {
                    map.put(neighbor, map.get(neighbor) + 1);
                }
            }
        }


        // Now we know each node's in-degree (out is trivial)
        Queue<DirectedGraphNode> queue = new LinkedList<>();


        Iterator<DirectedGraphNode> iter = graph.iterator();
        while(iter.hasNext()){
            DirectedGraphNode node = iter.next();
            // get all nodes without indegree
            if(!map.containsKey(node)){
                queue.offer(node);
                list.add(node);
            }
        }


        while(!queue.isEmpty()){
            DirectedGraphNode node = queue.poll();
            for(DirectedGraphNode next : node.neighbors){
                // node "next"'s parent has been processed
                map.put(next, map.get(next) - 1);
                if(map.get(next) == 0){
                    list.add(next);
                    queue.offer(next);
                } 
            }
        }


        return list;
    }
}


8、音频运行时系统的架构设计 本文深入探讨了音频运行时系统的分层设计及其优势,包括逻辑层和物理层的功能划分。通过分层设计,开发者可以更轻松地管理和优化音频资源,确保其在不同平台上的高效运行。文章还介绍了平台适配与优化、错误处理与调试以及未来发展方向等内容,为开发者提供了宝贵的参考和指导。 阅读详情

相关推荐

Android Camera性能优化概述

做camera性能优化方面的工作有几年了,想写一篇文章简单介绍一下其中涉及到的具体技术,这篇文章会大概介绍一下涉及到的技术。

weixin_42136255的博客 4025

拓扑排序详解(包含算法原理图解、算法实现过程详解、算法例题变式全面讲解等)

非常详细的讲解。点开有惊喜!

aliyonghang的博客 2万+

BCIC IV 2a数据集:从下载到实战应用全解析

本文全面解析了BCI Competition IV 2a(BCIC IV 2a)数据集的应用流程。从官方渠道下载数据、解析其结构,到在MATLAB和Python环境中进行数据导入、预处理(包括处理特殊受试者A04T),并详细演示了从特征提取(如CSP)到分类(如LDA、SVM)的完整实战步骤,为脑机接口研究者提供了从入门到实践的清晰指南。

weixin_28235513的博客 975

BFS—拓扑排序

拓扑排序是bfs的一个简单的运用,具体实现的思路如下; 先将入度为0的点放入队列,然后取出对头,用对头更新其他点的入度,如果发现新的点的入度为0,则将该点放入队列,如此循环,直到队列为空; 要注意,有环图一定无拓扑排序,所以拓扑排序的一个简单运用为判断一个图是否为有环图。 这个可以用反证法; 假定一个有环图存在拓扑排序; 入队的某一时刻,记A环中的Q点为此环中的一个入队的点,说明此刻该点的入度为0,有因为Q点是第一个入队,说明环中指向它的P点未入队,P点未入队说明Q点的入度>=1,与入队的条

weixin_62953519的博客 1425

深入解析Android14应用安装权限:从声明到授予的完整适配指南

本文深入解析Android14应用安装权限的适配方法,重点介绍了从权限声明到授予的完整流程。与Android13相比,Android14在权限管理机制上进行了重要调整,特别是通过AppOpsManager实现权限的对象化封装。文章详细讲解了权限声明的基础配置、Framework层适配方案、运行时权限授予方法以及常见问题排查指南,帮助开发者高效完成Android14权限适配。

o9p0q1的博客 696

学好超几何分布的核心公式,破解双色球!

彩票本质是概率游戏,不存在"必中公式"科学投注的核心是风险收益比管理长期投注的期望值始终为负(理论回报率约47%-63%)数学维度:运用概率工具优化策略经济维度:控制投注成本在可承受范围人文维度:将彩票视为社会公益的参与方式通过本文构建的数学模型,彩民可以在概率框架内实现更理性的投注决策。但最终能否收获幸运,仍取决于那个永恒的未知数——概率女神的眷顾。一、超几何分布的核心公式。

weixin_44904675的博客 1万+

bfs拓扑排序

拓扑排序 bfs做法 我们使用一个队列来进行广度优先搜索。初始时,所有入度为 0 的节点都被放入队列中,它们就是可以作为拓扑排序最前面的节点,并且它们之间的相对顺序是无关紧要的。 在广度优先搜索的每一步中,我们取出队首的节点 u: 我们将 u 放入答案中; 我们移除 u 的所有出边,也就是将 u 的所有相邻节点的入度减少 1。如果某个相邻节点 v 的入度变为 00,那么我们就将 v 放入队列中。 在广度优先搜索的过程结束后。如果答案中包含了这 n 个节点,那么我们就找到了一种拓扑排序,否则说明图中存在环,也

惜兰blog 895

Tina Linux WiFi驱动移植避坑指南:以RTL8733bs为例,详解设备树、Kconfig与固件依赖

本文详细解析了在Tina Linux上移植RTL8733bs WiFi驱动的关键步骤与常见问题,涵盖设备树配置、内核依赖、固件加载及启动时序等核心环节。通过实战案例和排查清单,帮助开发者规避SDIO控制器配置、电源管理、GPIO极性等典型陷阱,确保驱动稳定运行。

weixin_29164185的博客 264

算法系列--BFS解决拓扑排序

💕"请努力活下去"💕作者:Lvzi文章主要内容:算法系列–算法系列–BFS解决拓扑排序大家好,今天为大家带来的是什么是拓扑排序拓扑排序–解决有顺序的排序问题(要做事情的先后顺序)建立一个有向图来表示做事情的先后顺序如何建图–灵活使用语言提供的容器要存储的是:一个节点与其所相连的节点(边),两点构成一条线段–哈希表存储我们是根据入度是否为0来决定先后顺序的一个节点的入度就是有多少个指向该节点的边使用数组int[] in表示将所有入度为0的节点添加进队列循环队列t。

Mylvzi的博客 1568

AI安全护栏评测:TrustedExecBench如何量化评估大模型防护能力

在人工智能和机器学习领域,模型安全对齐是确保AI系统可靠、可控的核心技术。其原理是通过设计安全机制(即“护栏”)来约束模型行为,防止生成有害、偏见或越界内容。这项技术的核心价值在于平衡AI能力与风险管控,是可信AI部署的基石。应用场景广泛覆盖内容审核、对话系统、代码生成等需要人机交互的领域。本文聚焦的TrustedExecBench项目,正是针对“护栏”性能量化评估这一痛点,提供了一个标准化、自动化的开源评测框架。该工具通过构建多维度的恶意测试套件,并引入基于模型的动态评判机制,能够系统性地检验大语言模型在

weixin_42525428的博客 379

即插即用系列(代码实践) | CVPR 2025 FDConv:频域动态卷积,打破密集预测任务的参数效率瓶颈

本文提取自 CVPR 2025 的最新底层算子革新论文《Frequency Dynamic Convolution for Dense Image Prediction》。近年来,动态卷积(Dynamic Convolution)通过融合多个并行卷积核极大地提升了模型性能,但研究表明:这些并行卷积核在频域上的响应高度相似,导致了极其严重的参数浪费,且缺乏对不同频率特征的自适应能力。本文复现了该网络的核心架构——FDConv(频率动态卷积)。该方案创造性地在傅里叶域(Fourier Domain)中学习固定参

分享顶会顶刊论文即插即用模块 113

BFS全排列

题目描述 输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 nn。 输出格式 组成的所有不重复的数字序列,每行一个序列。 每个数字保留 5 个宽。 import java.util.Scanner; public class Main { static int n=0; static int[] used=new int[100]; static int[] pd=new int[100]; //pd是判

weixin_45454137的博客 1273

Open3D 基于法向量夹角的特征点提取

基于法向量夹角的特征点提取是一种在点云处理中用于识别表面变化显著区域的技术。通过计算点云中每个点的法向量与其邻域点法向量之间的夹角,可以判断点云表面的局部变化程度,并提取那些法向量变化较大的点作为特征点。这种方法特别适用于提取边缘、角点等关键几何特征。

纵马踏花向自由 1554

leetCode刷题记录4-面试经典150题-2

主要就是度为0的不必非要用栈,用队列也行,队列直接作为拓扑排序的终止条件即可。没有前置关系时不需要要特判,全是度为0的节点,也可以照常执行。不要用statck,继承了Vector, 有很多锁,效率很低。修改后4ms,差不多了吧。

hza163的博客 584

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【算法】【优选算法】BFS 解决拓扑排序

BFS 解决拓扑排序

yj20040627的博客 1725

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【基础算法总结】BFS 解决拓扑排序

BFS 解决拓扑排序

fight_p的博客 1590

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【算法】BFS(最短路径问题、拓扑排序)

💬 hello!各位铁子们大家好哇。今日更新了最短路径问题和拓扑排序的相关内容。

qinjh_的博客 3025

【优选算法】BFS解决拓扑排序

本篇文章列举了三个经典的LeetCode算法题目,包括课程表、课程表 II和火星词典。我会在每道题中提到每道题的解题思路,并提供解决本题的C++代码。

是阿建吖! 1060

【算法】BFS 解决拓扑排序

题⽬链接:207. 课程表题⽬描述:你这个学期必须选修 numCourses ⻔课程,记为 0 到 numCourses - 1。在选修某些课程之前需要⼀些先修课程。先修课程按数组 prerequisites 给出,其中prerequisites[i] = [a(i), b(i)] ,表⽰如果要学习课程 a(i) 则 必须 先学习课程b(i)。◦ 例如,先修课程对 [0, 1] 表⽰:想要学习课程 0 ,你需要先完成课程 1。请你判断是否可能完成所有课程的学习?如果可以,返回 true;

2402_85428625的博客 2023

BFS:解决拓扑排序问题

要知道什么拓扑排序我们首先要知道什么是有向无环图,有向无环图我们看名字其实就很容易理解,有向就是有方向,无环就是没有环形结构,这里我们展示一下有向无环图和有向有环图:入度(Indegree):一个顶点的入度是指有多少条边指向这个顶点。换句话说,它表示该顶点有多少个直接前驱节点。(简单来说就是对于一个顶点来说,所有指向他的边之和)出度(Outdegree):一个顶点的出度是指从这个顶点出发有多少条边。也就是说,它表示该顶点有多少个直接后继节点。(简单来说对于一个顶点来说,,这个顶点往外伸出的边的总和)

2301_79969994的博客 1470

BFS解决拓扑排序和FloodFill问题

介绍了图的简单概念,并使用BFS宽度优先来解决一些拓扑排序和FloodFill洪水灌溉问题

2401_89019969的博客 5766

清晰讲明 BFS实现的拓扑排序

快速且准确的学会bfs的方法进行拓扑排序

wgz0621的博客 2340

【基础算法总结】BFS_拓扑排序问题

入度:针对一个点,有多少条边指向它。出度:针对一个点,有多少条边从这个点出去。如上图:1顶点的入度是0,出度是2。2顶点的入度是2,出度是1。3顶点的入度是1,出度是2…使用拓扑排序的算法解决问题时,首先我认为最重要的一点是能否把题干转换成有向无环图。二维数组和哈希表。但是并不是只能用这两个,而是要根据题目灵活的选取嵌套。建完图后就是拓扑排序的主体,首先把入度为0的顶点入队列,再使用bfs删除取出顶点的那些边,在把它指向的顶点入度-1。最后判断结果的时候要么问是否存在拓扑排序要么就是返回拓扑序列。

2301_77900444的博客 1294

算法沉淀——BFS 解决拓扑排序(leetcode真题剖析)

Breadth-First Search (BFS) 在拓扑排序中的应用主要是用来解决有向无环图(DAG)的拓扑排序问题。拓扑排序是对有向图中所有节点的一种线性排序,使得对于每一条有向边 (u, v),节点 u 在排序中都出现在节点 v 的前面。如果图中存在环路,则无法进行拓扑排序。

立志做一个高产且细节博主 1626

【优选算法之BFS】No.16---多源BFS和BFS解决拓扑排序

【优选算法之BFS】No.16---多源BFS和BFS解决拓扑排序

小沈.的博客 1617

拓扑排序:BFS 解法的原理探究与流程梳理

有向无环图入度就是当前的这个点有几条线指向当前的点比如说我们的这个4,入度就是2,因为有3和2指向4这个点AOV网:定点活动图在有向无环图中,用定点来表示一个活动,用边来表示活动的先后顺序的图结构拓扑排序就是找到事情的先后顺序,排序结果不唯一的重要应用:判断图中是否有环1、找出图中入度为0的节点,然后输出(就是我们这里的准备厨具和买菜)2、删除与该点链接的边重复1、2操作,直到图中没有点或者没有入度为0的点为止(因为可能存在环)借助队列,来一次bfs就行了。

2301_80863610的博客 8856
上一篇: 拓扑排序DFS做法
下一篇: Course Schedule I&II
michaelbinwang
博客等级 码龄10年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值