拓扑排序--入度

基于入度的拓扑排序(Kahn's Algorithm) 本文中的图用邻接链表来表示 拓扑排序只针对于有向无环图(DAG)才能完成,所以可以利用拓扑排序来判断一个有向图是否有环。 某一点的入度:图中指向该顶点的边的个数 图1 :DAG 以上图简单说明,点0的入度即为2。下面介绍拓扑排序的算法流程: Step 1:计算出所有顶点的入度。 Step2 :将所有入度为0的点加入到一个队列。 Step3 :将队头元素取出,然后pop()。 阅读详情

换个形象点的解释,我们在学习一门课程之前,应该需要一定的预备知识,比如在学习B课程之前我们需先学习A(后用< X,Y > 表示X课程是Y课程的预备知识,其实与上述有序偶的含义相同),则有 < A,B >。我们还有 < C,B >, < B,D >, < E,D >, < D,F >, < D,G >, < H,G >. 现在要求你合理安排A-H这些课程的学习顺序。这个任务的要求实际上就是对A-H进行拓扑排序。 

以上面给课程排序为例,我们首先要学的,一定是一个不需要任何预备知识的课程,然后学完这个课程之后,根据边的关系再看有哪些新的课程可以学习,同时我们还要清楚,学完一门课程后,就不需要再次学习这一门课程了。

我们将其与图做个类比。 
不需要预备知识的课程-> 入度为0的点 
新的课程->所指向的下一个点 
每门课之学一次->从图中删除节点 && 从图中删除有向边 

接着再根据图类比结果决定存储的数据 
入度为0的点->需要存储每个节点的入度 
所指向的下一个点->需要存每个节点的后继 
删除节点与有向边-> 这里讨论一下: 
如果我们真的删除了节点和有向边,那就意味着无法在找到这些数据了。因为我们还需要判断是否形成了DAG,最保险的做法是将下一个节点的入度-1。如果发现某个节点的入度为-1了,表明存在有向环,那么说明不存在与拓扑排序。

hdu1285

要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。

#include <iostream>

#include <cstdio>

#include <vector>

#include <cstring>

#include <queue>

using namespacestd;

const int maxn =505;

int indegree[maxn];

vector<int> mp[maxn];

queue<int> q,ans;

void init(int n)

{

    memset(indegree,0,sizeof(indegree));

    for (int i =1; i <= n; i ++) {

        mp[i].clear();

    }

    while (!q.empty()) {

        q.pop();

    }

    while(!ans.empty())

    {

        ans.pop();

    }

}

bool solve(int n)

{

    bool succ =true;

    while(1)

    {

        for (int i =1; i <= n ; i ++) {

            if (indegree[i] ==0) {//每次寻找入度为0的点,即不用其他知识即可以直接学的,加入队列。

                q.push(i);

                ans.push(i);

                indegree[i] = -1;

                break;//该题要求输出编号小的在前,所以每次取编号最小的入度为0的点开始。若不要求,该行break可删除。

            }

        }

        if (q.empty()) {

            break;

        }

        while (!q.empty()) {

            int t =q.front();q.pop();

            for (int i =0; i <mp[t].size(); i ++) {

                if (indegree[mp[t][i]] == -1) {//如果下一个点入度为-1,说明在之前已经学过,形成了环,所以不能进行拓扑排序

                    succ = false;

                    break;

                }

                elseindegree[mp[t][i]] --;//每次去掉所指向的点的一条边,当一个点没有被指向,入度为0时,就可以被学习

            }

            mp[t].clear();

            if (!succ) {

                break;

            }

        }

        if (!succ) {

            break;

        }

    }

    if (ans.size() != n) {//

        succ = false;

    }

    return succ;

}

int main()

{

    int n,m;

    while (scanf("%d%d",&n,&m) !=EOF) {

        int a,b;

        init(n);

        for (int i =0; i < m; i ++) {

            scanf("%d%d",&a,&b);

            mp[a].push_back(b);

            indegree[b] ++;

        }

        if(solve(n))

        {

            printf("%d",ans.front()) ;ans.pop();

            while (!ans.empty()) {

               printf(" %d",ans.front());

                ans.pop();

                

            }

            printf("\n");

       }

        

    }

    return0;

}



拓扑排序与入度为0的结点算法解析及实现 拓扑排序是一种用于有向无环图(DAG, Directed Acyclic Graph)的重要操作,它可以对图中的结点进行排序,使得对于每一条有向边 (u, v),顶点 u 在排序中都出现在顶点 v 之前。本文介绍一种通过重复寻找入度为0的结点,并删除该结点及其发出的边来实现拓扑排序的方法,并分析其时间复杂度。同时,也将讨论如果图中包含环路将会发生什么情况。 阅读详情

相关推荐

RAGFlow核心引擎DeepDoc之PDF解析大起底

本文深入解析RAGFlow中的deepdoc模块,重点介绍了pdf文档解析器的实现细节。deepdoc包含parser(文档解析器)和vision(视觉处理)两大核心功能,其中pdf解析是最复杂的部分。文章详细剖析了PdfParser类的设计架构,包含PlainParser(基础文本提取)、RAGFlowPdfParser(核心处理流水线)和VisionParser(视觉扩展)三个类,它们通过统一的__call__方法返回标准化结果。还具体讲解了初始化过程如何加载OCR引擎、布局识别模型、表格结构识别器等关

yxkong的专栏 2026

算法理论——拓扑排序(一定要会)

文章目录解释证明例题题目描述示例拓扑排序解法 解释 为了方便,我们令点数为n ,边数为m 。 在图论中,一个有向无环图必然存在至少一个拓扑序与之对应,反之亦然。 拓扑排序:简单来说,就是将图中的所有节点展开成一维序列,对于序列中任意的节点 ,如果在序列中 在 的前面,则说明在图中存在从 出发达到 的通路,即 排在 的前面。反之亦然。 同时,我们需要知晓「入度」和「出度」的概念: 入度:有多少条边直接指向该节点; 出度:由该节点指出边的有多少条。 因此,对于有向图的拓扑排序,我们可以使用如下思

hyk的博客 1629

本地部署静态网站托管平台 Netlify 并实现外部访问(Windows 版本)

Netlify 是一款基于云计算的网站部署和托管平台,专为开发者提供便捷的静态网站和 Jamstack 应用部署服务。它的能力在于将网站构建、部署、托管以及持续集成等流程高度集成,简化了开发和运维的复杂程度。用户无需关心服务器的配置、维护等工作。本文将详细介绍如何在本地安装 Netlify 以及结合路由侠内网穿透实现外网访问 Netlify。

lyxnwct的博客 524

图论算法

最近好多考试,紧张,感觉还没有学好呢,电子最急了,还没有复习到该到的地方,哎,还不好考,哭唧唧。最近好忙呀!忙的不知道开始干什么好。不多说别的了,今晚要写不完图论了……还是开始加油吧。 基本概念: 结点的度:无向图中与结点相连的边的数目,称为结点的度。 结点的入度:在有向图中,以这个结点为终点的有向边的数目。 结点的出度:在有向图中,以这个结点为起点的有向边的数目。 权值:边的“费用”,...

雨潇的博客 940

SAP PI实战:5分钟搞定REST适配器同步接口配置(含Postman测试技巧)

本文详细介绍了如何在SAP PI中快速配置REST适配器同步接口,包括ESR设计、集成流配置及Postman测试技巧。通过实战步骤和关键参数设置,帮助开发者高效实现系统集成,特别适合需要实时数据交互的业务场景。

weixin_33738555的博客 485

Kaggle大神Abhishek的机器学习框架实战:从红酒数据集看交叉检验的坑与解法

本文通过Kaggle竞赛Grandmaster Abhishek Thakur的实战经验,以红酒数据集为例,深入探讨了机器学习中交叉检验的五大陷阱与优化策略。文章详细解析了决策树max_depth调优过程中的过拟合现象,对比了五种主流交叉检验方法的适用场景,并提供了回归问题中的分层技巧和特征工程陷阱的解决方案。最后,总结了交叉检验方案选型决策树,帮助数据科学家在实际项目中提升模型泛化能力。

h6j7k8l9p0的博客 964

【算法学习】拓扑排序详解

拓扑排序 拓扑序就是后边走的点有前边的先决条件 上图就是个拓扑序 学数据结构之前必须先学习c语言 以此类推 学习顺序可以是 c语言 数据结构 python 面向对象 c++ linux 网、系统 分布式项目 c语言 linux 数据结构 网、系统 python 面向对象 c++ 分布式项目 … 拓扑序不唯一 拓扑排序不能有环,有环就不行了 入度:有几条边的终点是该点 出度:有几条边的起点是该点 度 = 出度 + 入度 拓扑排序流程: 求入度 看入度为零的点为起点 从起

moX980的博客 639

游戏数据训练世界模型:AI物理规律学习与仿真应用实践

世界模型作为理解现实世界动态的AI工具,通过多模态数据学习物理和空间属性来预测未来状态。其核心原理在于从环境交互中提取物理规律,技术价值体现在能够安全、低成本地训练AI系统应对复杂场景。在应用层面,游戏数据因其结构化环境和内置物理引擎,成为世界模型训练的优质素材。游戏世界中的物体交互、运动轨迹等数据天然包含现实物理规律,特别适合训练物理AI。本文以General Intuition公司获得3.2亿美元融资为切入点,深入探讨游戏数据在世界模型训练中的技术实现路径,涵盖数据提取管道构建、多模态数据融合方法,以及

weixin_29056865的博客 367

图论之拓扑排序

基本概念 人们有时要做很多事情,这些事情之间又有依赖关系或者说有优先级之分,只有优先级高的事情做完之后才能去做优先级低的事,比如穿衣服的先后,课程学习的顺序,安排客人的座位等。 例如:存在事情a,b,c,d,其中a的优先级最高,b,c的优先级其次,d的优先级最低,则abcd或者acbd就是两种排序,我们把事情变成点,先后关系变成边,则在图中求一个可行的排序,就是拓扑排序 一个图能进行拓扑排序的充要条件是它是一个有向无环图(DAG) 图的入度与出度 概念 出度:以点u为起点的边的数量 入度:以点

weixin_43602607的博客 457

别再凭感觉选电容了!手把手教你计算电机控制器里的母线电容(附Excel计算工具)

本文详细解析了电机控制器中母线电容的选型方法,从理论计算到工程实践,帮助工程师避免常见误区。通过精确计算纹波电压、电容容量等关键参数,并结合薄膜电容与电解电容的性能对比,提供实用的选型建议。附带的Excel计算工具可快速完成参数计算,适用于工业伺服驱动和电动车电机控制器设计。

weixin_28720573的博客 522

【用unity实现100个游戏之7】实现一个类《杀戮尖塔》的卡牌回合制游戏(附项目源码)

【用unity实现100个游戏之7】实现一个类《杀戮尖塔》的卡牌回合制游戏(附项目源码)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

拓扑排序

图论,搜索,队列

2301_76869282的博客 791

研制过程评审活动(三)工程研制阶段

工程研制阶段主要任务、及评审活动

Abel的博客 2388

拓扑排序 入度

1 //拓扑排序延续之拓扑排序 入度 2 3 #include <iostream> 4 5 #include <stack> 6 7 using namespace std ; 8 9 const int MAXN = 100 ; 10 11 int G[MAXN][MAXN] , ...

dizhuang3784的博客 371

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STM32F407中文手册

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

有向无环图之拓扑排序kahn算法(基于入度)

拓扑排序(TopSort)是一种针对有向无环图(DAG)的线性排序算法。return [] # 存在环,无法拓扑排序。print("有环,无法拓扑排序")我们将有一个→ 指向,称为有一个入度。

2301_77726810的博客 1412

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

拓扑排序的两种实现--基于dfs和基于入度

#include #include #include #include #include #include #include using namespace std; int n; vector vec[100]; int vis[100]; struct node{ int n; int t; bool operator < (const node& a)con

点羽染墨 2132

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

拓扑排序+入度检测

拓扑排序:      若有 a->b, 则要求a一定要在b之前打印出来。    思路:          找到一个入度为0的节点,打印出来,把与之相邻的节点入度-1;          重复上面工作。 参考代码: void Topsort(graph *g) { int *Indegree = new int[g->n]; int i; /*统计入度*/ for(i=

yanghangjun的专栏 2098

拓扑排序(依次加入入度为0的节点)

文章目录拓扑排序二、代码 拓扑排序 1)在图中找到所有入度为0的点输出 2)把所有入度为0的点在图中删掉,继续找入度为0的点输出,周而复始 3)图的所有点都被删除后,依次输出的顺序就是拓扑排序 要求:有向图且其中没有环 应用:事件安排、编译顺序 二、代码 public static List<Node> sortedTopology(Graph graph) { // key 某个节点 value 剩余的入度 HashMap<Node, Integer> inMap

xiaolu567的博客 1058

烦人的幻灯片——入度为1,栈,模仿拓扑排序

题目:http://www.sqyoj.club/problem.php?id=1016 思路:如果数i坐标在某幻灯片X范围内,则建立双向边,并增加数i的入度。遍历所点数,将入度为1的点存入栈。 从栈中取出一个数,并将该数连接的字母染色,再将该字母连接的数字的入度都减1,如果数字的入度是1,则将数字入栈。反复进行,直到栈空。如果栈内存入的数字刚好是n个,则说明可行,否则输出“None”。 这...

qq_36314344的博客 281

利用栈+入度实现拓扑排序

利用栈+入度实现拓扑排序 class Solution { Stack<Integer> stack = new Stack<Integer>(); boolean flag[] ; int []result; Map<Integer,List<Integer>> map =new HashMap<Integ...

qq_44932835的博客 551

poj1094 拓扑排序,栈+入度,方法很难想到,

//poj1094 拓扑排序 栈+入度 //若A比B,C,D小,A的度就是3.只要通过不断缩小B/C/D的度,然后减小A的度,当A的度是0的时候,就可以存进栈里面了 //题解的强大之处在于灵活利用了入度这个概念,存在解的时候,必须满足只有一个单源点,沿着解这条路走,必然是单源点后面跟着入度为1的点, //然后删除单源点,更新入度,重复,又是仅有一个单源点,且后面跟着入度为1的点。最后仅剩一个单源点

chchlh的专栏 1561

【经典算法】--- 拓扑排序(通过入度表,DFS与栈,队列分别实现)

【经典算法】--- 拓扑排序介绍方法通过入度表(直接遍历)通过DFS和栈实现通过队列实现(待更新) 介绍 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称...

来日浅谈的博客 7569

Leetcode:NO.210课程表2 拓扑排序与入度

题目 题目链接:https://leetcode-cn.com/problems/course-schedule-ii 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例 1: 输入: 2, [[1,0]]

泛泛之素 559

【拓扑排序】|图论|基于BFS / DFS 的拓扑排序 |出度入度

DFS的递归思想在这个拓扑序列中的表现也是非常优越的,一般DFS和BFS的第二种思想也是根据出度为零来进行计算的所以说这种实现方式实际上不推荐,但是可以实现,首先是实现的方式,由于DFS是嵌套递归的思想,所以选择的出度分割点的思想。由于用出度来作为标准,我们需要一个回溯的过程,也就是要么我们直接建立一个往回的反向边,要么我们就要多加一个其他的回溯方式,大致思路相同,不过更加难思考。的过程,首先我们要处理初始结点,我们遍历一边所有的结点,把所有结点入度为零的都存入队列,完成。

司职在下的博客 507

1940. Ordering Tasks(拓扑排序,用set装住入度为0的点)

/*1940. Ordering Tasks(拓扑排序,用set装住入度为0的点) 给出一些数字对(i,j), i必须在j前面执行 输出一个序列,使得序列按照指定的先后顺序输出,如果有多个 结果,则按照字典序输出.用set来装入度为0的点。set的特性是 按照插入的大小进行排序。所以可以保证字典序 拿到一个入度为0的后,就在原来的记录入得的inDegree的数组相应 位置-

xiehaoyun2012的专栏 408

拓扑排序+BFS+入度 310. 最小高度树

310. 最小高度树 对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。 格式 该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。 你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无向边, [0, 1]和 [1, 0] 是相同的,因此不会同时出现在 edges 里。 示例 1:

BLUEsang的博客 265
上一篇: 动态规划--最长上升子序列LIS
下一篇: 动态规划--hdu1241搬寝室
Falling~
博客等级 码龄14年 13粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值