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 中整型对象存储的位置
May 16 Python
整理Python 常用string函数(收藏)
May 30 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
python构建指数平滑预测模型示例
Nov 21 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 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错误级别的设置方法
2013/06/17 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
video.js使用改变ui过程
2017/03/05 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python Logging 日志记录入门学习
2018/06/02 Python
python贪吃蛇游戏代码
2020/04/18 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
小学生手册家长评语
2014/04/16 职场文书
珍惜资源的建议书
2014/08/26 职场文书
大学生个人总结范文
2015/02/15 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书