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中用字符串调用函数或方法示例代码
Aug 04 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
python如何在列表、字典中筛选数据
Mar 19 Python
python使用生成器实现可迭代对象
Mar 20 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
python实现连连看游戏
Feb 14 Python
Python pip配置国内源的方法
Feb 14 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
python基于tkinter制作m3u8视频下载工具
Apr 24 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
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
JavaScript中的事件处理
2008/01/16 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
Python面向对象特殊成员
2017/04/24 Python
Python timeit模块的使用实践
2020/01/13 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
英文自荐信
2013/12/19 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书