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中datetime常用时间处理方法
Jun 15 Python
Python装饰器基础详解
Mar 09 Python
Django中cookie的基本使用方法示例
Feb 03 Python
TensorFlow模型保存/载入的两种方法
Mar 08 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Python flask框架如何显示图像到web页面
Jun 03 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
Python 读取位于包中的数据文件
Aug 07 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 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
php5.2时间相差8小时
2007/01/15 PHP
网友原创的PHP模板类代码
2008/09/07 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
Memcache 在PHP中的使用技巧
2010/02/08 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
分享10段PHP常用代码
2015/11/11 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
JavaScript大数相加相乘的实现方法实例
2020/10/18 Javascript
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
Python列表append和+的区别浅析
2015/02/02 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
食品安全承诺书范文
2014/08/29 职场文书
党员公开承诺书2016
2016/03/24 职场文书