有向无环图拓扑排序(python实现)_python 有向无环图 拓扑排序-程序员宅基地

技术标签: 算法  python  

问题:有向无环图的拓扑排序

题目描述
由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义分别如下:
若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。
设R是集合X上的偏序,如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序关系。
由偏序定义得到拓扑有序的操作便是拓扑排序。
拓扑排序的流程如下:

  1.   在有向图中选一个没有前驱的顶点并且输出之;
    
  2.   从图中删除该顶点和所有以它为尾的弧。
    

重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。
采用邻接表存储有向图,并通过栈来暂存所有入度为零的顶点,可以描述拓扑排序的算法如下:

在本题中,读入一个有向图的邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法判断此图是否有回路,如果没有回路则输出拓扑有序的顶点序列。

输入
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个整数,如果为1,则表示第i个顶点有指向第j个顶点的有向边,0表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。
输出
如果读入的有向图含有回路,请输出“ERROR”,不包括引号。
如果读入的有向图不含有回路,请按照题目描述中的算法依次输出图的拓扑有序序列,每个整数后输出一个空格。
请注意行尾输出换行。
样例输入
4
0 1 0 0
0 0 1 0
0 0 0 0
0 0 1 0
样例输出
3 0 1 2

n=0
G=[[] for i in range(100)]
inDegree=[0]*100
def topologicalSort():
    global n,G,inDegree
    list=[]
    list_1=[]
    num=0
    for i in range(0,n):
        if inDegree[i]==0:
            list.append(i)
    while len(list)!=0:
        t=list[-1]
        list_1.append(t)
        list.pop(-1)
        for i in range(len(G[t])):
            v=G[t][i]
            inDegree[v]-=1
            if inDegree[v]==0:
                list.append(v)
        G[t].clear()
        num+=1
    if num==n:
        for i in list_1:
            print(i,end=' ')
    else:
        print("ERROR")
if __name__=='__main__':
    n = int(input())
    for i in range(0, n):
        ar = input()
        b = ar.split(' ')
        graph = [int(i) for i in b]
        for j in range(len(graph)):
            if graph[j] == 1 and i!=j:
                inDegree[j]+=1
                G[i].append(j)
    topologicalSort()
    print()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a284365/article/details/118530232

智能推荐

mysql 高级(进阶学习)_mysql高级进阶-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏8次。视图就是将某个查询语句存储在数据中,并为其命名,视图中并不存储数据,数据还是在基本表中存储。定义视图使用视图删除视图存储过程就是把一段处理逻辑存入到数据库中,使用是就由 JDBC 调用即可。调用存储过程可以减少应用程序和数据库交互次数,在数据库内部执行,执行效率高。存储事先需要定义,有三种参数类型:in 入参(接收调用者传入的数据)out 返回(向调用者返回数据)inout (既可以接收调用者传入的数据,也可以向调用者返回数据)函数是一个特殊的存储过程。存储过程不仅有输入参数,还有输出参数,但是没有返回值,_mysql高级进阶

goquery php,golang:Goquery简单爬虫实例-程序员宅基地

文章浏览阅读189次。Selection类型提供的方法,这些方法是页面解析最重要,最核心的方法1)类似函数的位置操作-Eq(indexint)*Selection//根据索引获取某个节点集-First()*Selection//获取第一个子节点集-Last()*Selection//获取最后一个子节点集-Next()*Selection..._goquery获取tbody的数据

计算机资源库在哪,电脑的资源管理在哪里-程序员宅基地

文章浏览阅读2.7k次。语音内容:大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。电脑的资源管理的位置:1、单击开始菜单,在弹出的快捷菜单中选择文件资源管理器。2、按组合键Win+R打开运行窗口。3、在运行窗口中输入命令:explorer按回车键执行命令即可以打开资源管理器窗口。4、在桌面的任务栏上右击鼠标,在弹出的快捷菜单中选择“任务管理器。5、在任务管理器的菜单栏中选择文件中运行新任务。6、在运行..._计算机库到哪里找

适合新手的CTF靶场合集-程序员宅基地

文章浏览阅读3.4w次,点赞42次,收藏344次。前言我整理得没有那么全,这里的合集主要还是面对新手。做题贵精不在多,好好练习每一题,学习每个知识点,不懂的百度或者 Google 即可。记住,你是为了提高自己而去打 CTF 。CTF 比赛时间表CTFwiki(入门必看wiki): https://ctf-wiki.github.io/ctf-wiki/#/introduction XCTF社区: https://time.xctf...._ctf靶场

彻底理解位运算——左移、右移_左移和右移-程序员宅基地

文章浏览阅读6.2w次,点赞168次,收藏598次。相信大家在各种语言各种框架中都能看到二进制的操作。左移、右移、&、|、^等等操作。那么这篇帖子让各位彻底弄懂左移、右移。首先先区分那个是左移、那个是右移,这很简单,从箭头指向的方向来区分。右移左移:很简单的来说就是把当前的二进制,整体往左边移动N个单位,N取决于你的表达式。那么用一个例子,和画图来理解一下吧。32 ..._左移和右移

安装PyQt5和相应的pycharm设置和在pycharm验证PyQt安装是否成功_pycharm如何查看python是否安装成功-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏33次。1.软件环境Python3.7pycharm-community-2020.1.1(我的是社区版,专业版安装过程也类似)2.安装PyQt5组件 2.1安装PyQt5打开命令行窗口,输入 pip install PyQt5 -i https://pypi.douban.com/simple 下载安装PyQt5(windows10可以打开 Windows PowerShell ,我就是用它。-i 后面的是豆瓣镜像地址,可以加速Python库下载,常用镜像地址有..._pycharm如何查看python是否安装成功

随便推点

大数据存储架构详解:数据仓库、数据集市、数据湖、数据网格、湖仓一体_数据仓库 数据集市 数据湖-程序员宅基地

文章浏览阅读1.3w次,点赞7次,收藏75次。本文以文字+思维导图+表格的形式详解了数据库、数据仓库、数据集市、数据湖、数据网格、湖仓一体之间的区别。_数据仓库 数据集市 数据湖

如何运用python多线程threading实现程序的并发_python 如何实现并发获取数据-程序员宅基地

文章浏览阅读443次。每次技术的进步都是面对问题解决问题,有了现实中需要解决的问题了我们才能想各种方法解决他也就成就了技术的跃迁。_python 如何实现并发获取数据

柴天佑pdf 自适应控制_串讲:控制理论:自适应控制(APC)-程序员宅基地

文章浏览阅读4k次,点赞3次,收藏21次。自适应控制 (APC)说道自适应控制(APC),也要追溯到5年前第一次接触,当时还只会应用下面的自适应律公式来求解,这里结合自己的一些想法来对自适应控制进行深入剖析,希望可以帮助到大家。APC的历史:在早期的二十世纪五十年代,APC被开始研究,当时应用在飞机的自动导航装置上。简而言之,APC是一种带有在线参数识别的控制方法,主要可以被分为模型参考自适应控制(MRAC)、自校正控制器(STC)、参数..._自适应控制 柴天佑pdf

浅谈Overlay File System的应用_filesystem overlay-程序员宅基地

文章浏览阅读6.7k次,点赞3次,收藏18次。Overlay FS在Docker中的使用_filesystem overlay

职场法则-高效沟通_双五十理论-程序员宅基地

文章浏览阅读802次。高效沟通在职场上,我们能遇到向上沟通,平行沟通,向下沟通,这其中的沟通就显得尤为重要,这是我学习过程中一个同事写的,我拿来做笔记记录下来,保持一个高效的沟通,才能在职场上走得更远。1、何为沟通?沟通就是无论用任何的方式交换(有传递、有反馈)信息的过程。著名的双50%理论在工作中有50%以上的时间都用在了沟通上。如开会、谈判、指示、评估。可是,工作中的50%以上的障碍都是在沟通中产生的。沟通的本质是价值的交换2、沟通的类别传递方式语言沟通语言沟通是指用语言符号进行的信息交流,包括_双五十理论

严重: Compilation error org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException-程序员宅基地

文章浏览阅读1w次。Maven新手的错误 今天初学maven工程,见识过他的强大,心所向恋,却又很次揪心。看着某马的视频学的maven,其环境是jdk1.7+tomcat7.0我机子装的是jdk1.8+tomcat7&tomcat8。错误1:jvm环境过低,用的是其默认的jre1.5,错误详情:[INFO] Scanning for projects...[INFO] ..._严重: compilation error

推荐文章

热门文章

相关标签