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 相关文章推荐
简介Django中内置的一些中间件
Jul 24 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
python实现两个文件合并功能
Apr 01 Python
python调用API实现智能回复机器人
Apr 10 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
numpy求平均值的维度设定的例子
Aug 24 Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
基于python操作ES实例详解
Nov 16 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
WAF的正确bypass
2017/01/05 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
javascript实现动态标签云
2015/10/16 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
详解django的serializer序列化model几种方法
2018/10/16 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
印尼太阳百货公司网站:Matahari
2018/02/04 全球购物
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
物业管理求职自荐信
2013/09/25 职场文书
人事主管岗位职责范本
2013/12/04 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
行政专员求职信范文
2014/05/03 职场文书
公司员工活动策划方案
2014/08/20 职场文书
村安全生产责任书
2014/08/25 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
服务员态度差检讨书
2014/10/28 职场文书
勇敢的心观后感
2015/06/09 职场文书
班委竞选稿范文
2015/11/21 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
2019同学聚会主持词
2019/05/06 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python