python 排序 拓撲排序

2021-09-29 06:31:15 字數 1707 閱讀 6683

在電腦科學領域中,有向圖的拓撲排序是其頂點的先行排序,對於每個從頂點u到頂點v的有向邊uv,在排序的結果中u都在v之前。

如果圖是有向無環圖,則拓撲排序是可能的(為什麼不說一定呢?)

圖論:是組合數學的乙個分支,它和其他分支比如:群論、拓撲學、矩陣論有著密切的關係。圖是圖論的主要研究物件。圖是由若干給定的頂點以及連線兩定點的變構成的圖形,這些圖形通常用來描述某些事物間的某種特定關係。頂點用於代表事物,而頂點之間的邊則代表事物之間具有這種特定關係。

在圖論中,由乙個有向無環圖的頂點組成的序列,並且僅當滿足以下條件時,稱為改圖的乙個拓撲排序:

每個頂點只出現一次

當在序列中a出現在b以前,則圖中不存在由b指向a的路徑

卡恩演算法

找到入度為0的點,將該點放到結果中,然後再圖中將此節點相連的邊刪去,重新搜尋圖,再次找到入度為0的點,因為這個點的父節點已經出現在結果集中,所以該點也能被放入結果集中。重複直到圖中沒有入度為0的點

如果此時結果集中的點個數等於原來圖中的點的個數,就說明排序成功完成,否則就說明待排序的圖不是有向無環圖,無法排序

對於已經是有向無環圖的排序過程:

找到入度為0的點,放入結果集中,然後刪去與該節點相連的邊

重複執行上述操作,直到結果中點的個數和圖的節點數相同

def topological_sort(g):

'''找到入度為0的節點a,然後將其放在序列中,刪去這個a的鄰接點列表'''

topological_list=

node_list=list(range(len(g)))

node_list_temp=copy.deepcopy(node_list)#為node_list選擇的備份原因如下:

#如果找到的第乙個入度為0的點不刪去,那麼每次while結束選擇的都將是這個點

#但是也不能在遍歷node_list時刪去,那樣會造成死迴圈(類似與for i in range(a):,在迴圈中又對a進行操作的意思

while true:

if len(topological_list)==len(g):

return topological_list

node_list=node_list_temp

for node in node_list:

flage=true

for i in range(len(g)):#在所有結點的鄰接點列表中遍歷,若均未存在,說明不依賴任何點,即入度為0

if node in g[i]:

flage=false

break

if flage:

node_list_temp.remove(node)

g[node]=#選擇置空,否則會造成下標溢位

break

# return topological_list

線性時間

產生和檢測有向無環圖

尤拉把問題的實質歸於一筆畫問題,即判斷乙個圖是否能夠遍歷完所有的邊而沒有重複,而柯尼斯堡七橋問題則是一筆畫問題的乙個具體情境。尤拉最後給出任意一種河──橋圖能否全部走一次的判定法則,從而解決了「一筆畫問題」。對於乙個給定的連通圖,如果存在超過兩個(不包括兩個)奇頂點,那麼滿足要求的路線便不存在了,且有n個奇頂點的圖至少需要n/2筆畫出。如果只有兩個奇頂點,則可從其中任何一地出發完成一筆畫。若所有點均為偶頂點,則從任何一點出發,所求的路線都能實現,他還說明了怎樣快速找到所要求的路線。[1]

python 拓撲排序 Python 拓撲排序

python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...

拓撲排序 Python實現

拓撲序 如果圖中從v到w有一條有向路徑,則v一定排在w之前 aov activity on vertex 如果有合理的拓撲序,則一定是有向無環圖 directed acyclic graph,dag 遍歷圖,得到indegree cnt counter 使用python內建的計數器 for val ...

Python排序搜尋基本演算法 之拓撲排序

拓撲排序是對有向無環圖的一種排序,滿足如下兩個條件 1.每個頂點出現且只出現一次 2.若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。如上的無環有向圖,v表示頂點 v a b c d e e表示有向邊 e a b a d b c d c d e e c 如下 def indegree0 v,...