拓?fù)渑判騊ython實(shí)現(xiàn)的過(guò)程
有向無(wú)環(huán)圖
拓?fù)渑判蚴轻槍?duì)有向無(wú)環(huán)圖(DAG, Directed Acyclic Graph)的
具有以下性質(zhì):
- 如果這個(gè)圖不是 DAG,那么它是沒(méi)有拓?fù)湫虻模?/li>
- 如果是 DAG,那么它至少有一個(gè)拓?fù)湫颍?/li>
- 反之,如果它存在一個(gè)拓?fù)湫?,那么這個(gè)圖必定是 DGA。
拓?fù)渑判?/h2>
對(duì)一個(gè)有向無(wú)環(huán)圖(Directed Acyclic Graph簡(jiǎn)稱DAG)G進(jìn)行拓?fù)渑判?,是將G中所有頂點(diǎn)排成一個(gè)線性序列,使得圖中任意一對(duì)頂點(diǎn)u和v,若邊(u,v)∈E(G),則u在線性序列中出現(xiàn)在v之前。
通常,這樣的線性序列稱為滿足拓?fù)浯涡?Topological Order)的序列,簡(jiǎn)稱拓?fù)湫蛄小?/p>
簡(jiǎn)單的說(shuō),由某個(gè)集合上的一個(gè)偏序得到該集合上的一個(gè)全序,這個(gè)操作稱之為拓?fù)渑判颉?/p>
算法步驟
在講算法步驟之前先了解入度與出度的概念:
- 入度:頂點(diǎn)的入度是指「指向該頂點(diǎn)的邊」的數(shù)量;
- 出度:頂點(diǎn)的出度是指該頂點(diǎn)指向其他點(diǎn)的邊的數(shù)量。
可以理解為入度為0的點(diǎn)就是起點(diǎn),拓?fù)渑判虿襟E如下:
- 從 DAG 圖中選擇一個(gè)入度為0的頂點(diǎn)并輸出;
- 從圖中刪除該頂點(diǎn)和所有以它為起點(diǎn)的有向邊;
- 重復(fù) 1 和 2 直到當(dāng)前的 DAG 圖為空或當(dāng)前圖中不存在入度為0的頂點(diǎn)為止。后一種情況說(shuō)明有向圖中必然存在環(huán)
代碼實(shí)現(xiàn)
對(duì)于下圖:
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 ("拓?fù)渑判蚪Y(jié)果:") g.topologicalSort() # 結(jié)果為[5, 4, 2, 3, 1, 0]
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
下載與當(dāng)前Chrome對(duì)應(yīng)的chromedriver.exe(用于python+selenium)
這篇文章主要介紹了下載與當(dāng)前Chrome對(duì)應(yīng)的chromedriver.exe(用于python+selenium),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Python將主機(jī)名轉(zhuǎn)換為IP地址的方法
今天小編就為大家分享一篇Python將主機(jī)名轉(zhuǎn)換為IP地址的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-083種Python 實(shí)現(xiàn)酷炫進(jìn)度條的實(shí)用方法
這篇文章主要介紹了3種Python 實(shí)現(xiàn)酷炫進(jìn)度條的實(shí)用方法,文章圍繞Python的相關(guān)資料展開對(duì)實(shí)現(xiàn)進(jìn)度條的介紹,需要的小伙伴可以參考一下2022-04-04python用WxPython庫(kù)實(shí)現(xiàn)無(wú)邊框窗體和透明窗體實(shí)現(xiàn)方法詳解
這篇文章主要介紹了python用WxPython庫(kù)實(shí)現(xiàn)無(wú)邊框窗體和透明窗體實(shí)現(xiàn)方法詳解,需要的朋友可以參考下2020-02-02淺談Python中函數(shù)的定義及其調(diào)用方法
今天小編就為大家分享一篇淺談Python中函數(shù)的定義及其調(diào)用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python提取具有某種特定字符串的行數(shù)據(jù)方法
今天小編就為大家分享一篇python提取具有某種特定字符串的行數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12