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中的文件和目录操作实现代码
Mar 13 Python
python迭代器与生成器详解
Mar 10 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
深入理解Django自定义信号(signals)
Oct 15 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
快速查找Python安装路径方法
Feb 06 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
python如何实现图片压缩
Sep 11 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 Python
pandas按条件筛选数据的实现
Feb 20 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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解决约瑟夫环示例
2014/04/09 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
PHP getName()函数讲解
2019/02/03 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
JavaScript中的"=、==、==="区别讲解
2019/01/22 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
python处理数据,存进hive表的方法
2018/07/04 Python
python 二维数组90度旋转的方法
2019/01/28 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
老师的检讨书
2014/02/23 职场文书
请假条标准格式规范
2014/04/10 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js