網站首頁 編程語言 正文
有向無環圖
拓撲排序是針對有向無環圖(DAG, Directed Acyclic Graph)的
具有以下性質:
- 如果這個圖不是 DAG,那么它是沒有拓撲序的;
- 如果是 DAG,那么它至少有一個拓撲序;
- 反之,如果它存在一個拓撲序,那么這個圖必定是 DGA。
拓撲排序
對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u在線性序列中出現在v之前。
通常,這樣的線性序列稱為滿足拓撲次序(Topological Order)的序列,簡稱拓撲序列。
簡單的說,由某個集合上的一個偏序得到該集合上的一個全序,這個操作稱之為拓撲排序。
算法步驟
在講算法步驟之前先了解入度與出度的概念:
- 入度:頂點的入度是指「指向該頂點的邊」的數量;
- 出度:頂點的出度是指該頂點指向其他點的邊的數量。
可以理解為入度為0的點就是起點,拓撲排序步驟如下:
- 從 DAG 圖中選擇一個入度為0的頂點并輸出;
- 從圖中刪除該頂點和所有以它為起點的有向邊;
- 重復 1 和 2 直到當前的 DAG 圖為空或當前圖中不存在入度為0的頂點為止。后一種情況說明有向圖中必然存在環
代碼實現
對于下圖:
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]
總結
原文鏈接:https://johnjim0816.blog.csdn.net/article/details/121047511
相關推薦
- 2022-09-30 python計算列表元素與乘積詳情_python
- 2022-05-08 python函數裝飾器構造和參數傳遞_python
- 2022-03-27 詳解OpenCV中簡單的鼠標事件處理_python
- 2022-09-08 Python如何將list中的string轉換為int_python
- 2022-12-05 Android?Crash與ANR詳細介紹_Android
- 2022-07-13 spring-boot2.6.x兼容swagger2問題
- 2023-04-26 Sklearn調優之網格搜索與隨機搜索原理詳細分析_python
- 2023-11-22 Linux fatal: unable to access ‘https://github xxxx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支