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基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
python处理圆角图片、圆形图片的例子
Apr 25 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
Python引用模块和查找模块路径
Mar 17 Python
对Python中Iterator和Iterable的区别详解
Oct 18 Python
python实现给scatter设置颜色渐变条colorbar的方法
Dec 13 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
python在openstreetmap地图上绘制路线图的实现
Jul 11 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
python神经网络编程实现手写数字识别
May 27 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 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/04/22 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
JavaScript 动态将数字金额转化为中文大写金额
2009/05/14 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
pytorch masked_fill报错的解决
2020/02/18 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
浅析Python __name__ 是什么
2020/07/07 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
Java文件和目录(IO)操作
2014/08/26 面试题
知识竞赛活动方案
2014/02/18 职场文书
公证委托书
2014/08/01 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
工作经历证明书范文
2014/11/02 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
垂直极限观后感
2015/06/08 职场文书