Python关于拓扑排序知识点讲解


Posted in Python onJanuary 04, 2021

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。

通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting):

  • 每个顶点出现且只出现一次;
  • 若A在序列中排在B的前面,则在图中不存在从B到A的路径。

Python关于拓扑排序知识点讲解

实例代码

from collections import defaultdict 
 
class Graph: 
 def __init__(self,vertices): 
  self.graph = defaultdict(list) 
  self.V = vertices
 
 def addEdge(self,u,v): 
  self.graph[u].append(v) 
 
 def topologicalSortUtil(self,v,visited,stack): 
 
  visited[v] = True
 
  for i in self.graph[v]: 
   if visited[i] == False: 
    self.topologicalSortUtil(i,visited,stack) 
 
  stack.insert(0,v) 
 
 def topologicalSort(self): 
  visited = [False]*self.V 
  stack =[] 
 
  for i in range(self.V): 
   if visited[i] == False: 
    self.topologicalSortUtil(i,visited,stack) 
 
  print (stack) 
 
g= Graph(6) 
g.addEdge(5, 2); 
g.addEdge(5, 0); 
g.addEdge(4, 0); 
g.addEdge(4, 1); 
g.addEdge(2, 3); 
g.addEdge(3, 1); 
 
print ("拓扑排序结果:")
g.topologicalSort()

执行以上代码输出结果为:

拓扑排序结果:

[5, 4, 2, 3, 1, 0]

实例扩展:

def toposort(graph):
 in_degrees = dict((u,0) for u in graph) #初始化所有顶点入度为0
 vertex_num = len(in_degrees)
 for u in graph:
  for v in graph[u]:
   in_degrees[v] += 1  #计算每个顶点的入度
 Q = [u for u in in_degrees if in_degrees[u] == 0] # 筛选入度为0的顶点
 Seq = []
 while Q:
  u = Q.pop()  #默认从最后一个删除
  Seq.append(u)
  for v in graph[u]:
   in_degrees[v] -= 1  #移除其所有指向
   if in_degrees[v] == 0:
    Q.append(v)   #再次筛选入度为0的顶点
 if len(Seq) == vertex_num:  #如果循环结束后存在非0入度的顶点说明图中有环,不存在拓扑排序
  return Seq
 else:
  print("there's a circle.")
G = {
 'a':'bce',
 'b':'d',
 'c':'d',
 'd':'',
 'e':'cd'
}
print(toposort(G))

输出结果:

['a', 'e', 'c', 'b', 'd']

到此这篇关于Python关于拓扑排序知识点讲解的文章就介绍到这了,更多相关Python 拓扑排序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python简单文本处理的方法
Jul 10 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
详解Python核心对象类型字符串
Feb 11 Python
Python使用numpy实现BP神经网络
Mar 10 Python
Python实现多线程的两种方式分析
Aug 29 Python
详解python的四种内置数据结构
Mar 19 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
NumPy排序的实现
Jan 21 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
Python实现对齐打印 format函数的用法
Apr 28 Python
Python经典五人分鱼实例讲解
Jan 04 #Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 #Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 #Python
python自动化发送邮件实例讲解
Jan 04 #Python
Python Selenium库的基本使用教程
Jan 04 #Python
selenium学习教程之定位以及切换frame(iframe)
Jan 04 #Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 #Python
You might like
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
python设置windows桌面壁纸的实现代码
2013/01/28 Python
python 字典(dict)按键和值排序
2016/06/28 Python
Django URL传递参数的方法总结
2016/08/28 Python
Python实现excel转sqlite的方法
2017/07/17 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
python实现比较文件内容异同
2018/06/22 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
某公司部分笔试题
2013/11/05 面试题
主持人演讲稿范文
2013/12/28 职场文书
学生期末评语大全
2014/04/30 职场文书
工地安全质量标语
2014/06/07 职场文书
主题团日活动总结
2014/06/25 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
小人国观后感
2015/06/11 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL