python實(shí)現(xiàn)拓?fù)渑判虻姆椒ú襟E
拓?fù)渑判蚴菍τ邢驘o環(huán)圖(DAG)進(jìn)行排序的一種算法,它可以將圖中的頂點(diǎn)排成一個(gè)線性序列,使得圖中的任意一條有向邊都從序列中的較早頂點(diǎn)指向較晚頂點(diǎn)。換句話說,如果圖中存在一條從頂點(diǎn)A到頂點(diǎn)B的有向邊,那么在拓?fù)渑判蛑许旤c(diǎn)A一定出現(xiàn)在頂點(diǎn)B之前。
統(tǒng)計(jì)入度:
對圖中的每個(gè)頂點(diǎn),統(tǒng)計(jì)其入度,即指向它的邊的數(shù)量。
初始化:
將入度為0的頂點(diǎn)加入一個(gè)隊(duì)列,作為初始節(jié)點(diǎn)。
拓?fù)渑判颍?br />1.從隊(duì)列中取出一個(gè)頂點(diǎn),并輸出。
2.將該頂點(diǎn)的所有鄰接頂點(diǎn)的入度減1。
3.如果某個(gè)鄰接頂點(diǎn)的入度減為0,則將其加入隊(duì)列。
4.重復(fù)步驟3,直到隊(duì)列為空。
檢查:
如果輸出的頂點(diǎn)數(shù)等于圖中的頂點(diǎn)數(shù),則拓?fù)渑判虺晒?,否則圖中存在環(huán)。
假設(shè)有以下有向圖:
1 → 2 → 4 ↓ ↗ ↓ ↗ ↓ 3 5 → 6
首先統(tǒng)計(jì)每個(gè)頂點(diǎn)的入度:
1號頂點(diǎn)入度為0
2號頂點(diǎn)入度為1
3號頂點(diǎn)入度為1
4號頂點(diǎn)入度為1
5號頂點(diǎn)入度為2
6號頂點(diǎn)入度為1
將入度為0的頂點(diǎn)加入隊(duì)列:[1]
開始拓?fù)渑判颍?br />取出隊(duì)列中的1號頂點(diǎn),并輸出:1
將1號頂點(diǎn)的鄰接頂點(diǎn)2號和3號的入度分別減1,得到入度為0的2號和3號頂點(diǎn),加入隊(duì)列:[2, 3]
取出隊(duì)列中的2號頂點(diǎn),并輸出:2
將2號頂點(diǎn)的鄰接頂點(diǎn)4號的入度減1,得到入度為0的4號頂點(diǎn),加入隊(duì)列:[3, 4]
取出隊(duì)列中的3號頂點(diǎn),并輸出:3
將3號頂點(diǎn)的鄰接頂點(diǎn)5號的入度減1,得到入度為1的5號頂點(diǎn),加入隊(duì)列:[4, 5]
取出隊(duì)列中的4號頂點(diǎn),并輸出:4
將4號頂點(diǎn)的鄰接頂點(diǎn)6號的入度減1,得到入度為0的6號頂點(diǎn),加入隊(duì)列:[5, 6]
取出隊(duì)列中的5號頂點(diǎn),并輸出:5
取出隊(duì)列中的6號頂點(diǎn),并輸出:6
完成拓?fù)渑判?,輸出結(jié)果為:[1, 2, 3, 4, 5, 6]。
from collections import defaultdict, deque def topological_sort(graph): # 統(tǒng)計(jì)入度 indegree = defaultdict(int) for node in graph: for neighbor in graph[node]: indegree[neighbor] += 1 # 將入度為0的節(jié)點(diǎn)加入隊(duì)列 queue = deque([node for node in graph if indegree[node] == 0]) result = [] # 拓?fù)渑判? while queue: node = queue.popleft() result.append(node) # 將該節(jié)點(diǎn)的鄰接節(jié)點(diǎn)的入度減1,并將入度為0的節(jié)點(diǎn)加入隊(duì)列 for neighbor in graph[node]: indegree[neighbor] -= 1 if indegree[neighbor] == 0: queue.append(neighbor) # 如果結(jié)果中的節(jié)點(diǎn)數(shù)等于圖中的節(jié)點(diǎn)數(shù),則拓?fù)渑判虺晒? if len(result) == len(graph): return result else: return None # 測試 graph = { '1': ['2', '3'], '2': ['4', '5'], '3': ['5'], '4': ['6'], '5': ['6'], '6': [] } sorted_nodes = topological_sort(graph) if sorted_nodes: print("拓?fù)渑判蚪Y(jié)果:", sorted_nodes) else: print("圖中存在環(huán),無法進(jìn)行拓?fù)渑判?)
統(tǒng)計(jì)入度:
遍歷圖中的每個(gè)節(jié)點(diǎn),統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)的入度,即指向該節(jié)點(diǎn)的邊的數(shù)量。
初始化:
將入度為0的節(jié)點(diǎn)加入一個(gè)隊(duì)列,作為拓?fù)渑判虻某跏脊?jié)點(diǎn)。
拓?fù)渑判颍?br />1.從隊(duì)列中取出一個(gè)節(jié)點(diǎn),并輸出到結(jié)果列表中。
2.將該節(jié)點(diǎn)的所有鄰接節(jié)點(diǎn)的入度減1。
3.如果某個(gè)鄰接節(jié)點(diǎn)的入度減為0,則將其加入隊(duì)列。
4.重復(fù)上述步驟直到隊(duì)列為空。
檢查:
如果結(jié)果列表中的節(jié)點(diǎn)數(shù)等于圖中的節(jié)點(diǎn)數(shù),則拓?fù)渑判虺晒?,否則圖中存在環(huán)。
到此這篇關(guān)于python實(shí)現(xiàn)拓?fù)渑判虻姆椒ú襟E的文章就介紹到這了,更多相關(guān)python 拓?fù)渑判騼?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python下使用Trackbar實(shí)現(xiàn)繪圖板
這篇文章主要為大家詳細(xì)介紹了Python下使用Trackbar實(shí)現(xiàn)繪圖板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分
這篇文章主要介紹了Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分,下文我們介紹一些下面是加載內(nèi)置訓(xùn)練數(shù)據(jù)集的常見操作,需要的小伙伴可以參考一下2022-02-02對于Python的Django框架使用的一些實(shí)用建議
這篇文章主要介紹了對于Python的Django框架使用的一些實(shí)用建議,包括一些優(yōu)秀模塊的介紹,要的朋友可以參考下2015-04-04Python 實(shí)現(xiàn)RSA加解密文本文件
這篇文章主要介紹了Python 實(shí)現(xiàn)RSA加解密文本文件的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12