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 linecache.getline()读取文件中特定一行的脚本
Sep 06 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
python集合用法实例分析
May 30 Python
Python 调用Java实例详解
Jun 02 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
浅谈python常用程序算法
Mar 22 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
linux下python中文乱码解决方案详解
Aug 28 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
Python如何把十进制数转换成ip地址
May 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
Windows下的PHP5.0详解
2006/11/18 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
PHP实现微信退款功能
2018/10/02 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
javascript基本数据类型和转换
2017/03/17 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
python实现定时播放mp3
2015/03/29 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
如何用python处理excel表格
2020/06/09 Python
python中的yield from语法快速学习
2020/11/06 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
生物技术专业求职信
2014/06/10 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python
Redis实现短信验证码登录的示例代码
2022/06/14 Redis