拓扑排序

拓扑排序例题 不懂的看这里 拓扑排序 以下是例题: 拓扑排序·一 简单拓扑判环 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7; vector<int> G[maxn]; int inDeg[maxn]; int n,m; queue<int>q; int sum; bool top(... 阅读详情

概述:

在现实生活中,某些事物可以用有向无环图(Directed Acyclic Graph,DAG)表述。这种有向无环图通常也称作“流程图”,比如,施工流程图、生产流程图、图中每个顶点可以代表一个具体的工序,每条有向边则反映了两个工序的前后次序。

拓扑序:如果图中从V到W有一条有向路径,则V一定排在W之前。满足此条件的顶点序列称为一个拓扑序。

获得一个拓扑序的过程就是拓扑排序

AOV如果有合理的拓扑序,则必定是有向无环图(Directed Acyclic Graph, DAG)。

实现思路:将该有向无环图用邻接表,表示并且结构中储存入入度数。开始时将所有入度为0的顶点插入队列;当队列不为空时,取出一个顶点v并输出;然后将与v相邻的顶点入度减1。当产生新的入度为0的顶点时,将其插入队列。重复这一过程直到队列为空时算法终止。所要寻找的拓扑排序为各顶点从队列取出的顺序。

C++实现代码如下:

/************************************************************************
*
* 文件名:8.2.1.cpp
*
* 文件描述:拓扑排序的实现
*
* 创建人:  fdk

* 时  间:  2018-09-14
*
* 版本号:1.0
*
* 修改记录:
*
************************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<limits.h>
#define max 100
using namespace std;

/*结构体的定义*/

struct node
{
    //边表结点的定义
    int vex;     //与头结点相邻的结点的位置
    node *next;  //指向下一个边表结点
};

/*头结点*/
struct vernode
{
    int data;   //存放顶点信息(顶点的名称例如V1)
    node *first;//指向第一个与头结点相邻的结点的信息
    int indegree;//头结点的入度数
};

/*图的定义*/
struct graph
{
    vernode v[max];//图的(顶点)头结点数组
    int vnums;     //顶点数
    int enums;     //边数
};

/*创建有向图的邻接表*/
void creategraph(graph &g, int n, int e)
{
    int i, j, k;
    g.vnums = n;  //顶点数
    g.enums = e;  //边数

    for (i = 1; i <= n; i++)
    {
        cin >> g.v[i].data;
        g.v[i].first = NULL;  //初始化头结点的邻接点为空
    }

    for (k = 1; k <= e; k++)
    {
        node *p = new node; //新建一个结点,用于加入到头结点之后
        cin >> i; //起点
        cin >> j; //终点
        p->vex = j;
        p->next = NULL;
        /*将边结点串联起来,如果加入的表结点为头结点的第一个结点则直接插入,否则找到最后一个表结点再插入*/
        if (g.v[i].first == NULL)
        {
            g.v[i].first = p;
        }
        else
        {
            node *nextp = g.v[i].first; //nextp为头结点之后的第一个表结点
            while (nextp->next)
            {
                nextp = nextp->next;
            }
            nextp->next = p;
        }
    }
}

/*打印邻接表*/
void printg(graph g)
{
    int i;
    cout << "图的邻接表为:" << endl;
    for (i = 1; i <= g.vnums; i++)
    {
        cout << g.v[i].data << ":" << " ";
        node *now;
        now = g.v[i].first;
        while (now)
        {
            cout << now->vex << " ";
            now = now->next;
        }
        cout << endl;
    }
}
/*拓扑排序*/
bool topsort(graph &g)
{
    queue<int> q;
    node *p;
    int counts = 0;//counts为计数器,如果输出顶点的个数与图中的顶点数不相等则该图有回路
    int i, j;

    /*初始化入度为0*/
    for (i = 1; i <= g.vnums; i++)
    {
        g.v[i].indegree = 0;
    }

    /*计算各个顶点的入度*/
    for (i = 1; i <= g.vnums; i++)
    {
        p = g.v[i].first;
        while (p)
        {
            //计算入度
            g.v[p->vex].indegree++;
            p = p->next;
        }
    }
    for (i = 1; i <= g.vnums; i++)
    {
        if (g.v[i].indegree == 0)
        {
            q.push(i);  //将度为0的顶点入队列,这里入队列的是入度为0的顶点在数组中的位置
        }
    }

    cout << "拓扑排序的序列为:" << endl;
    while (!q.empty())
    {
        j = q.front(); //返回第一个元素
        q.pop();       //将第一个元素从队列删除
        cout << g.v[j].data << " "; //输出栈顶元素
        counts++;
        p = g.v[j].first;  //让p指向入度为0的第一个节点

        /*将与顶点i的相邻顶点的入度减一*/
        while (p)
        {
            g.v[p->vex].indegree--;
            if (g.v[p->vex].indegree == 0)
            {
                q.push(p->vex);
            }
            p = p->next;
        }
    }
    cout << endl;

    if (counts != g.vnums)
    {
        return false;
    }
    else
    {
        return true;
    }
}
int main()
{
    graph g;
    creategraph(g, 6, 8);
    printg(g);
    if (topsort(g))
    {
        cout << "拓扑序列成功" << endl;
    }
    else
    {
        cout << "拓扑序列失败" << endl;
    }
    return 0;
}
















参考博客: 

http://www.voidcn.com/article/p-xaqsjglx-bdg.html
 

【数据结构】什么是拓扑排序—关于图的拓扑排序 ​对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列。拓扑排序:对一个有向图构建拓扑序列的过程。 ​ 阅读详情

相关推荐

FastAPI + Layui:打造企业级敏捷开发后台管理系统

本文详细介绍了如何使用FastAPI和Layui构建高效的企业级后台管理系统。FastAPI提供高性能的异步API支持,而Layui则简化了前端开发流程,两者结合可实现快速开发和部署。文章涵盖了从环境搭建、核心组件开发到性能优化的全流程,特别适合需要敏捷开发的企业项目。

weixin_29045585的博客 555

拓扑排序详解

古人学问无遗力 少壮功夫老始成

qq_56012214的博客 2万+

Memory SystemsCache, DRAM, Disk翻译学习DRAM部分(二)

DRAM 的发展史

qq_33473931的博客 995

拓扑序列(拓扑排序)

文章目录摘要什么是拓扑序列拓扑序的求法 摘要 本文主要介绍拓扑排序,和求解拓扑排序的方法。 什么是拓扑序列 拓扑序列是对于有向图而言的,有向图的拓扑序是其顶点的线性排序,使得对于从顶点uuu 到顶点vvv的每个有向边uvuvuv, uuu 在排序中都在vvv之前。 例如对于下图: 对于上图, 存在4条边:(1,3)(1,2)(2,4)(2,3) 该图的拓扑序必须要满足以下两点: 每个顶点只出现...

GD_ONE的博客 7万+

从零开始开发AI Agent:基于大模型的智能体实战指南

### 摘要 本文介绍了AI Agent的开发全流程,从基础概念到实际部署,涵盖大模型集成、工具调用和记忆系统构建等核心技术。通过电商客服案例展示实战应用,并提供调试优化与部署方案,最后展望了AI Agent的未来发展方向,帮助开发者快速掌握智能体开发技能。

ghs_gss的博客 4860

PCB印刷电路缺陷检测实战:从数据集准备到模型训练全流程解析

本文详细解析了PCB缺陷检测从数据集准备到模型训练的全流程。重点介绍了PKU-Market-PCB数据集的特点与下载方法,并提供了数据格式转换、模型选择(如YOLOv8)与训练配置的实战代码。针对PCB小目标检测的难点,文章给出了数据分析和模型优化的具体策略,帮助读者构建高效的缺陷检测系统。

weixin_29065791的博客 546

拓扑排序(topological sorting)介绍及Python实现

拓扑排序(topological sorting)介绍及Python实现,介绍了拓扑排序基本算法原理,并给出基于深度优先搜索和基于广度优先搜索的Python实现。

chenxy_bwave的专栏 2万+

手把手教你用git上传项目到GitHub(图文并茂,这一篇就够了),相信你一定能成功!!

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。即使是付费帐户,每个月不超过10美刀的费用也非常便宜。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一起完成这个项目。优点在于,他支持多人共同完成一个项目,因此你们可以在同一页面对话交流。 创建自己的项目,并备份,代码不需要保存在本地或者服务器,GitHub做得非常理想。 学习Git也有很多好处。他被视为一个预先维护过程,你可以按自己

左手の明天的博客 3万+

图结构专栏——拓扑排序

三种方法实现拓扑排序 一、什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。 例如,下面这个图: 它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法

lizefeng1998的博客 9023

具身智能(26):RDK S100的LeRobot或Agile X piper机械臂控制模型

本文档详细介绍了基于ROS2的机器人控制模型架构与标定数据联动机制。核心采用"感知-规划-控制"闭环流程,通过激光雷达、相机和IMU的融合数据实现厘米级定位(≤1cm)。文档包含两大控制模型配置:1)RDKLeRobot模型,重点说明PID参数调节和标定文件路径设置;2)AgileXPiper模型,强调驱动安装与外部标定文件集成。针对常见问题提供解决方案,如控制指令无响应需验证标定路径,运动偏差过大需重新标定等。最后给出批量部署方案,通过复制基准配置文件实现多机器人快速配置,要求定位偏差

码农17年的博客 175

/home 挂载点无法访问 怎么解决 指令可以进入Home目录 du: 无法访问“*“: 输入/输出错误

本文介绍了Linux系统中XFS文件系统损坏的故障排查与修复方法。当/home挂载点出现I/O错误时,通过dmesg发现XFS日志错误和磁盘I/O报错,判断可能是文件系统逻辑损坏或硬件故障。解决方案包括:1)尝试卸载分区;2)使用xfs_repair工具进行预检查和正式修复;3)在极端情况下使用-L参数强制清空日志;4)若存在硬件故障,建议优先进行数据抢救并更换硬盘。最后强调重要数据应先备份,再考虑系统重建。

专注于计算机研发知识和资讯分享 152

拓扑排序的原理及其实现

本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件和离散数学中偏序/全序概念的联系典型实现算法 Kahn算法基于DFS的算法 解的唯一性问题实际例子 取材自以下材料: http://en.wikipedia.org/wiki/Topological_sorting http://en.wikipedia.org/wiki/Hamiltonian_pat

不忘初心,好好沉淀 21万+

Linux | Ubuntu18.04安装RTX 4060显卡驱动完整教程

本节详细介绍了如何在ubuntu18系统安装4060显卡的驱动。

九七的博客 5159

拓扑排序详解及C++实现

介绍拓扑排序的定义、逻辑,包含完整的模拟过程和C++代码实现,及拓扑排序判环。拓扑序列:对于一个有向无环图将图中的顶点排成一个序列,其中每个边的起点在序列中一定在终点之前;通俗解释为:将一张图“压扁”,使顶点从左到右排成序列,且压扁后每条边的方向只能朝右,那么这个序列是这张图的拓扑序列。 拓扑排序就是求解一张有向无环图拓扑序列的过程。

一直爱算法的猫的博客 5983

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32F407中文手册

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

有向图拓扑排序

有向图拓扑排序 前言 本文介绍有向图拓扑排序算法的思路及代码实现,首先讲解什么是拓扑排序,其次介绍实现拓扑排序需要的检测有向图是否有环的算法及顶点排序算法,最终实现有向图的拓扑排序。 一、什么是拓扑排序? 给定一副有向图,将所有的顶点排序,使得所有的有向边均从排在前面的元素指向排在后面的元素,此时就可以明 确的表示出每个顶点的优先级。如对下图进行拓扑排序: 拓扑排序结果为: 根据拓扑排序的概念,如果对有向图进行拓扑排序,那么图中必须没有环,否则,就不能进行拓扑排序,然后在图中无环的情况下,再进行顶点排

Mekeater的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

什么是拓扑排序

一、什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。 例如,下面这个图: 它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:..

哦,原来你也在这里。 8251

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

拓扑排序及算法实现

一、拓扑排序概念 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。 简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 二、理解 在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。...

ShyTan的博客 1万+

拓扑排序算法

用unordered_map就比较万能了,完全像刚才想象出来的邻接表结构,我们这里是一个int的数后面挂了一个int数组,那不就和一个节点挂着一个节点的效果一样的吗。我们可以把给的信息抽象称一张有向图,题目问能否完成所有课程学习意思就是能不能把这个课程排个序,说白了就是能否拓扑排序,能否拓扑排序也就是是否这个图是否是有向无环图 —> 有向图中是否有环?,有向图就是边都是有方向的。直接对图来一次拓扑排序,当拓扑排序过程中发现没有入度为0的点的时候,但是图中还有剩余点的时候,此时这个图中一定会有环形结构。

2301_80224556的博客 1749

图的拓扑排序

算法思想 按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系,由此所得顶点的线性序列称之为拓扑有序序列。显然对于有回路的有向图得不到拓扑有序序列,因为有回路的话,顶点的先后次序就不确定了。 例如,下图,我们可以人为限定次序:A B C D 或 A C B D 如何进行拓扑排序? 从有向图中选取一个没有前驱(没有在它之前活动)的顶点,输出之; 从有向图中删去此顶点以及所有以它为尾的弧; 重复上述两步,直至图空,或者图不空但找不到无前驱的顶

ChanCherry的博客 3255

拓扑排序概念

拓扑排序,顾名思义,就是一种排序方法。这是一种什么排序?这种排序的作用?然后怎么去实现这种排序算法?现在就让我们仔细研究下。 1、什么是拓扑排序,也就是拓扑排序的概念 实际上,拓扑排序是一种图论算法,该算法在《数据结构与算法》一书中有涉猎。引用维基百科的定义: 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorti...

MinisterZ的博客 8191

【Java】拓扑排序

java实现拓扑排序

rellvera的博客 3570

有向图的拓扑排序

若排序后满足,图中的任意一条有向边(u, v),u的位置都在v的前面,则称为拓扑排序该图的拓扑排序为A B C D,AC 边A在C的前面,BC边BZ在C的前面.......所有边都满足定义。

shallrelow的博客 1038

拓扑排序基础

拓扑排序:对图中所有节点进行排序,保证每个节点的前置节点都在这个节点之前。【使用要求】:有向图,无环拓扑排序的顺序可能不只一种。拓扑排序也可以用来判断图中有没有环存在。在图中找到所有入度为0的点 (入度为0说明此节点没有前置节点,那它只能是其他节点的前置节点,所以先提出来放在拓扑排序前面)把所有入度为0的节点在图中删掉,重点是把与其他邻居节点的关联删除。之后继续找到入度为0的节点并删掉关联。直到所有的节点被删除,依次删除的顺序就是正确的拓扑排序结果如果无法删除所有点,说明有向图中有环存在。

2302_76853832的博客 1493
上一篇: 最小生成树之克鲁斯卡尔算法(Kruskal)
下一篇: 排序之桶排序
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值