拓扑排序的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;
    }
}


Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法 [原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结 by edata @2017-5-1 objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法 因为Win8/Win10对系统盘(默认c:)使用了高级权限管理,所以在此盘下操作文件的修改工作都需要管理员权限才行。 基于这个原因,导致非管理员安 阅读详情

相关推荐

保姆级避坑指南:Mid-360雷达到手后,用livox_ros_driver2从接线到出点云的完整流程

本文提供Mid-360雷达到手后的完整使用指南,涵盖从硬件接线、网络配置到livox_ros_driver2驱动的安装与调试,帮助用户避开常见陷阱,实现点云数据的稳定输出与可视化。重点解析了配置文件的参数设置和点云格式选择,确保用户能够高效部署和使用Mid-360雷达。

weixin_30733003的博客 488

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

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

aliyonghang的博客 2万+

树莓派视觉小车实战:OpenCV驱动的智能物体追踪系统

本文详细介绍了如何从零开始构建一个基于树莓派的智能视觉小车,实现物体跟踪功能。通过OpenCV进行图像处理,结合颜色与轮廓识别算法,让小车能够实时锁定并追踪特定目标。内容涵盖硬件搭建、软件环境配置、核心代码解析及运动控制逻辑,为创客和开发者提供了完整的实战指南。

weixin_29047545的博客 144

BFS—拓扑排序

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

weixin_62953519的博客 1425

全能扫描王的实现(python版本)- 目标检测图像矫正

全能扫描王python代码实现,可用于文件扫描或者是图像校正

搬砖猛女的啃书历程 5492

【云原生技术】sonar的官方web接口,获取质量阀结果的接口

以下是一个示例思路,说明如何调用 SonarQube 的质量阀查询接口并在前端展示“哪些条件没过”。假设前端使用 AJAX 或 fetch 从后端接口拿到 SonarQube 返回的 JSON(或直接前端请求 SonarQube API),前端再把解析结果展示给用户。测试覆盖率 (Coverage) 当前仅有 60%,未满足最低 80% 的要求,需要补充测试或优化以提升覆盖率。接口),就会返回相应的质量阀状态信息;里使用它来查询当前质量阀(质量门)的状态。,你用它即可获取该次分析的质量阀状态。

weixin_46453070的博客 1281

bfs拓扑排序

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

惜兰blog 895

微信小程序 - 最新详细实现跳转打开第三方网站方法流程及示例代码,在小程序内直接打开H5页面或微信公众号文章后台业务域名配置及下载校验文件上传服务器,嵌入外部网站跳转第三方h5网页(详细配置及代码)

微信小程序,打开第三方网站,放校验文件,怎么配置业务域名,后台配置,怎么打开外部没有关联的网站,小程序直接打开公众号文章,指定页面,跳转第三方url,跳转到外部网站,小程序跳转到任意外部网页,网站链接,跳转到其他网页(外部链接),小程序嵌入外部h5链接,校验文件怎么放到对方服务器上,要跳转到网站没权限放过去,校验文件验证域名,把校验文件放到对面网站,别人的服务器也打不开没权限怎么放呢,勾选不校验合法域名,txt,打不开别人的网页怎么办,真机调试打不开,无法跳转,有什么其他办法不放校验文件吗,别人不可能同意,

🏆 前端领域优质创作者 1万+

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

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

Mylvzi的博客 1568

PD详解—第一章—Type-C连接

Type-C连接 今天大师匈下班比较早,再给大家侃一侃PD,希望大家支持。 PD和Type-c的关系 首先讲一下PD快充的实现步骤,本文主要是Source端(电源),Sink端的差不多也一样,只是策略不同而已。 TypeC连接-->广播电源能力Source capbility(数据交互)->打电压电流->等待其他指令。 所以typec连接是第一步,很多人会从字面意思理解typec连接,这不就是把线给插上去就好了吗? 不知道有没有优秀的同学想到正确答案; 正确答案:typec连接的本质是为

大师匈的博客 1万+

30.Labview如何读懂别人程序、修改程序?

之前写过一次教大家的文章,这次教大家如何学习别人的程序,和如何搭建一套适合自己的程序框架。这里事先说明一下:要想搭好程序框架,一定要先把自己的系统,逻辑是什么!这非常重要,是决定你程序的关键因素。废话不多扯,直接说重点。

关注我,更多技术问题欢迎私聊~ 2448

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

计算机视觉与深度学习 | Matlab实现ORBSLAM2(附完整代码)

================================================ 博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 ================================================ 代码阅览 效果图 代码 imdsLeft = imageDatastore('C:\MichaelSpace\matlabworks

尘世冰封的专栏 1523

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

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

hza163的博客 584

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

BFS 解决拓扑排序

yj20040627的博客 1725

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

BFS 解决拓扑排序

fight_p的博客 1590

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【算法】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、付费专栏及课程。

余额充值