iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++图的拓扑排序是什么
  • 719
分享到

C++图的拓扑排序是什么

2023-06-30 17:06:04 719人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“c++图的拓扑排序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++图的拓扑排序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、前言且该序列必须满足下面两个条件:每个顶点

本文小编为大家详细介绍“c++图的拓扑排序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++图的拓扑排序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、前言

且该序列必须满足下面两个条件:

  1. 每个顶点出现且只出现一次。

  2. 若存在一条从顶点 x到顶点 y的路径,那么在序列中顶点 x 出现在顶点 y的前面。

拓扑排序只适用于 AOV网 (有向无环图)

若图中有环,则一定不存在拓扑序。

可以证明,一个有向无环图,一定存在一个拓扑序列。有向无环图,又被称为拓扑图。

入度: 即有多少条边指向自己这个节点。

出度: 即有多少条边从自己这个节点指出去。

二、算法流程

算法流程:

用队列来执行 ,初始化所有入度为0的顶点入队。

主要由以下两步循环执行,直到不存在入度为 0 的顶点为止

选择一个入度为 0 的顶点,并将它输出;

删除图中从顶点连出的所有边

循环结束

若输出的顶点数小于图中的顶点数,则表示该图存在回路,即无法拓扑排序,

否则,输出的就是拓扑序列 (不唯一)

模板如下:

数组模拟队列实现拓扑排序

bool topsort(){    int hh = 0, tt = -1;    // in[i] 存储点i的入度    for (int i = 1; i <= n; i ++ )// 将所有入度为0的点加入队列        if (in[i]==0)            top[ ++ tt] = i;    while (hh <= tt)    {        int t = top[hh ++ ];//找到入度为0的队头  //遍历一下以t为头节点的的单链表,给每一个结点都要减去1,并再次找到入度为0的点        for (int i = h[t]; i != -1; i = ne[i])        {        // 遍历 t 点的出边            int j = e[i];            if (-- in[j] == 0)//将入度减1,如果 j 入度为0,加入队列当中                top[ ++ tt] = j;        }    }    // 如果所有点都入队了,说明存在拓扑序列;否则不存在拓扑序列。    return tt == n - 1;}

使用STL queue实现拓扑排序

bool topsort(){    queue<int> q;    int t;    for(int i = 1;i <= n; ++i)// 将所有入度为0的点加入队列        if(in[i] == 0) q.push(i);    while(q.size()){        t = q.front();//每次取出队列的首部        top[cnt] = t;//加入到 拓扑序列中        cnt ++; // 序列中的元素 ++        q.pop();        for(int i = h[t];i != -1; i = ne[i]){            // 遍历 t 点的出边            int j = e[i];            in[j] --;// j 的入度 --            if(in[j] == 0) q.push(j); //如果 j 入度为0,加入队列当中        }    }    if(cnt < n) return 0;    else return 1;}

时间复杂度 O(n+m), n表示点数,m表示边数

三、有向图的拓扑排序

给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。

请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 &minus;1。

思路

我们每次找到入读为0的点,然后把他插入到队列里,然后将这个点删除,这也就意味着这个点连接的下一个点(可能是多个)的入度就会减1。

这个时候,我们就进入了下一轮。

我们因为前面将一个点删除了,那么它指向的点的入度就会都减去1,所以,就会出现新的点的入度为0,这个点显然是因为它的入度小,所以它理所应当的排在拓扑序里面在第二位。当前面的一个点没有了被删除了,那它就要首当其冲了。

和图的BFS思路很像,但是加了搜索的规则(即入度为零的先被搜索)可以看点这里

AC代码

#include <iOStream>#include <alGorithm>#include <cstring>#include <queue>using namespace std;const int N = 1e5 + 10;int e[N],ne[N],h[N],idx,in[N],n,m,top[N],cnt = 1;// e,ne,h,idx 邻接表模板// in 代表每个元素的入度// top是拓扑排序的序列,cnt代表top中有多少个元素void add(int a,int b){    e[idx] = b; ne[idx] = h[a];h[a] = idx ++;}bool topsort(){    queue<int> q;    int t;    for(int i = 1;i <= n; ++i)// 将所有入度为0的点加入队列        if(in[i] == 0) q.push(i);    while(q.size()){        t = q.front();//每次取出队列的首部        top[cnt] = t;//加入到 拓扑序列中        cnt ++; // 序列中的元素 ++        q.pop();        for(int i = h[t];i != -1; i = ne[i]){            // 遍历 t 点的出边            int j = e[i];            in[j] --;// j 的入度 --            if(in[j] == 0) q.push(j); //如果 j 入度为0,加入队列当中        }    }    if(cnt < n) return 0;    else return 1;}int main(){    int a,b;    cin >> n >> m;    memset(h,-1,sizeof h);//给头节点赋值为-1;    while(m--){        cin >> a >> b;        add(a,b);        in[b] ++;// a -> b , b的入度++    }    if(topsort() == 0) cout << "-1";    else {        for(int i = 1;i <= n; ++i){            cout << top[i] <<" ";        }    }    return 0;}

读到这里,这篇“C++图的拓扑排序是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++图的拓扑排序是什么

本文链接: https://www.lsjlt.com/news/330438.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++图的拓扑排序是什么
    本文小编为大家详细介绍“C++图的拓扑排序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++图的拓扑排序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、前言且该序列必须满足下面两个条件:每个顶点...
    99+
    2023-06-30
  • C++详细讲解图的拓扑排序
    目录一、前言二、算法流程三、有向图的拓扑排序一、前言 且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。若存在一条从顶点 x到顶点 y的路径,那么在序列中顶点 x 出现在顶点...
    99+
    2024-04-02
  • 拓扑排序是怎么排序的
    这篇文章主要讲解了“拓扑排序是怎么排序的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“拓扑排序是怎么排序的”吧!方法:1、找到图中的一个入度为0的结点,将此节点从图中剔除并加入到序列E中;2...
    99+
    2023-06-20
  • 详解C++实现拓扑排序算法
    目录一、拓扑排序的介绍二、拓扑排序的实现步骤三、拓扑排序示例手动实现四、拓扑排序的代码实现五、完整的代码和输出展示一、拓扑排序的介绍 拓扑排序对应施工的流程图具有特别重要的作用,它可...
    99+
    2024-04-02
  • 拓扑排序Python实现的过程
    目录有向无环图拓扑排序算法步骤代码实现总结有向无环图 拓扑排序是针对有向无环图(DAG, Directed Acyclic Graph)的 具有以下性质: 如果这个图不是 DAG,那...
    99+
    2023-01-31
    拓扑排序Python 拓扑排序 Python拓扑排序
  • C/C++浅析邻接表拓扑排序算法的实现
    目录前言一、拓扑排序算法的思路二、实现步骤1.求个顶点的入度2.拓扑排序的实现三、测试结果总结前言 在软件开发、施工过程、教学安排等等的一系列活动中,往往需要一个有向无环图来表示其是...
    99+
    2024-04-02
  • Java数据结构之有向图的拓扑排序详解
    目录前言拓扑排序介绍检测有向图中的环实现思路API设计代码实现基于深度优先的顶点排序实现思路API设计代码实现拓扑排序API设计代码实现测试验证前言 在现实生活中,我们经常会同一时间...
    99+
    2022-11-13
    Java有向图 拓扑排序 Java 有向图 Java 拓扑排序
  • Java实现拓扑排序的示例代码
    目录铺垫简介工作过程数据结构拓扑排序测试样例1测试样例2总结铺垫 有向图:我们这节要讲的算法涉及到有向图,所以我先把有向图的一些概念说一下,文章后面就不做解释啦。首先有向图节点与节点...
    99+
    2024-04-02
  • 无线网络拓扑是什么
    本文小编为大家详细介绍“无线网络拓扑是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“无线网络拓扑是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。选择最合适的网络布局对于任何系统的高效运行至关重要。对于无...
    99+
    2023-06-27
  • Java实现拓扑排序算法的示例代码
    目录拓扑排序原理1.点睛2.拓扑排序3.算法步骤4.图解拓扑排序算法实现1.拓扑图2.实现代码3.测试拓扑排序原理 1.点睛 一个无环的有向图被称为有向无环图。有向无环图是描述一个工...
    99+
    2024-04-02
  • 计算机网络的拓扑结构是什么
    本文小编为大家详细介绍“计算机网络的拓扑结构是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“计算机网络的拓扑结构是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2023-02-23
    计算机
  • 以太网采用的基本拓扑结构是什么
    本篇内容主要讲解“以太网采用的基本拓扑结构是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“以太网采用的基本拓扑结构是什么”吧!以太网的拓扑结构是“总线型”;以太网采用的拓扑结构基本是总线型,...
    99+
    2023-07-05
  • C++希尔排序是什么
    本篇内容介绍了“C++希尔排序是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!希尔排序前面的算法的平均效率都不怎么好,但我们注意到直插排...
    99+
    2023-06-17
  • c语言漂亮排序法是什么
    今天小编给大家分享一下c语言漂亮排序法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。漂亮排序算法 它的代码实现 &nb...
    99+
    2023-06-19
  • c++ sort自定义排序的方法是什么
    在C++中,可以使用std::sort函数来对容器进行排序。如果需要自定义排序方法,可以使用函数指针、函数对象或lambda表达式来...
    99+
    2023-10-21
    c++
  • 计算机网络中系统可靠性最高的网络拓扑结构是什么
    这篇文章给大家分享的是有关计算机网络中系统可靠性最高的网络拓扑结构是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。系统可靠性最高的网络拓扑结构是“网状网络”。网状网络有自我调校机制,即使在拓扑中有节点无法服务...
    99+
    2023-06-14
  • excel排序排不了的原因是什么
    本篇内容介绍了“excel排序排不了的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!excel排序排不了的原因:一、选择范围排序只...
    99+
    2023-07-02
  • Mysql排序的特性是什么
    本篇内容主要讲解“Mysql排序的特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql排序的特性是什么”吧!1、问题场景新上线一个交易记录导出功能,逻辑很简单:根据查询条件,导出对...
    99+
    2023-06-25
  • 几种常用的C#排序方法分别是什么
    几种常用的C#排序方法分别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。这五种C#排序方法,其实在其他语言平台中也是常见的,因此C#排序方法也可以说是其他语言的排序方法,...
    99+
    2023-06-17
  • CSS属性的排序是什么
    这篇文章主要介绍CSS属性的排序是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 一个小的测试 这个例子就是要让你思考如何更快的找到右边距属性? Example#1 di...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作