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 08 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
Apr 16 Python
python操作ie登陆土豆网的方法
May 09 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
浅谈Python处理PDF的方法
Nov 10 Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 Python
python通过matplotlib生成复合饼图
Feb 06 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
Django如何实现防止XSS攻击
Oct 13 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 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
写一个用户在线显示的程序
2006/10/09 PHP
怎样在PHP中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
php 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python中使用%与.format格式化文本方法解析
2017/12/27 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
对Python函数设计规范详解
2019/07/19 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
公司中秋节活动方案
2014/02/12 职场文书
求职简历自我评价范例
2014/03/12 职场文书
大雁塔导游词
2015/02/04 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python