Python實(shí)現(xiàn)拓?fù)渌惴ǖ氖纠?/h1>
更新時間:2023年05月30日 09:51:29 作者:福州司馬懿
本文主要介紹了Python實(shí)現(xiàn)拓?fù)渌惴ǖ氖纠?,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
前言
拓?fù)渑判蚴菆D論中一種重要的排序算法,用于對有向無環(huán)圖(DAG)進(jìn)行排序。在拓?fù)渑判蛑?,圖的頂點(diǎn)表示任務(wù),有向邊表示任務(wù)之間的依賴關(guān)系。拓?fù)渑判蛩惴梢哉业揭环N滿足所有任務(wù)依賴關(guān)系的順序。
算法原理
拓?fù)渑判蛩惴ǖ幕驹砣缦拢?/p>
- 創(chuàng)建一個空的排序結(jié)果列表。
- 找到圖中所有入度為0的頂點(diǎn)(即沒有依賴關(guān)系的頂點(diǎn)),將其加入排序結(jié)果列表。
- 移除該頂點(diǎn)以及與其相關(guān)的邊。
- 重復(fù)步驟2和3,直到圖中的所有頂點(diǎn)都被處理。
- 如果排序結(jié)果列表的長度等于圖中的頂點(diǎn)數(shù),則拓?fù)渑判虺晒?;否則,圖中存在環(huán),無法進(jìn)行拓?fù)渑判颉?/li>
Python實(shí)現(xiàn)
下面是使用Python實(shí)現(xiàn)拓?fù)渑判蛩惴ǖ氖纠a:
from collections import deque
def topological_sort(graph):
? ? # 統(tǒng)計每個頂點(diǎn)的入度
? ? in_degree = {v: 0 for v in graph}
? ? # 計算每個頂點(diǎn)的入度
? ? for v in graph:
? ? ? ? for neighbor in graph[v]:
? ? ? ? ? ? in_degree[neighbor] += 1
? ? # 將入度為0的頂點(diǎn)加入隊(duì)列
? ? queue = deque([v for v in graph if in_degree[v] == 0])
? ? # 保存拓?fù)渑判虻慕Y(jié)果
? ? result = []
? ? while queue:
? ? ? ? # 取出隊(duì)列中的頂點(diǎn)
? ? ? ? v = queue.popleft()
? ? ? ? result.append(v)
? ? ? ? # 移除頂點(diǎn)及其相關(guān)邊
? ? ? ? for neighbor in graph[v]:
? ? ? ? ? ? in_degree[neighbor] -= 1
? ? ? ? ? ? if in_degree[neighbor] == 0:
? ? ? ? ? ? ? ? queue.append(neighbor)
? ? # 判斷是否存在環(huán)
? ? if len(result) != len(graph):
? ? ? ? raise ValueError("圖中存在環(huán),無法進(jìn)行拓?fù)渑判颉?)
? ? return result
# 測試
graph = {
? ? 'A': ['B', 'C'],
? ? 'B': ['D'],
? ? 'C': ['D', 'E'],
? ? 'D': ['F'],
? ? 'E': ['F'],
? ? 'F': []
}
try:
? ? result = topological_sort(graph)
? ? print("拓?fù)渑判蚪Y(jié)果:", result)
except ValueError as e:
? ? print(e)
以上代碼中,graph表示圖的鄰接表表示法,其中每個頂點(diǎn)表示為一個鍵,其對應(yīng)的值為一個列表,列表中存儲了與該頂點(diǎn)有直接邊相連的頂點(diǎn)。
運(yùn)行代碼后,將輸出拓?fù)渑判虻慕Y(jié)果。
這就是使用Python實(shí)現(xiàn)拓?fù)渑判蛩惴ǖ氖纠a。通過這個算法,我們可以對有向無環(huán)圖進(jìn)行
排序,找到滿足任務(wù)依賴關(guān)系的順序。
到此這篇關(guān)于Python實(shí)現(xiàn)拓?fù)渌惴ǖ氖纠奈恼戮徒榻B到這了,更多相關(guān)Python 拓?fù)渌惴▋?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
Python利用裝飾器click處理解析命令行參數(shù)
這篇文章主要為大家詳細(xì)介紹了Python如何利用裝飾器click實(shí)現(xiàn)處理解析命令行參數(shù)功能,文中的示例代碼簡潔易懂,需要的小伙伴快跟隨小編一起了解一下 2022-10-10
-
Python面試不修改數(shù)組找出重復(fù)的數(shù)字
這篇文章主要為大家介紹了不修改數(shù)組找出重復(fù)的數(shù)字Python實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2022-05-05
-
用pywin32實(shí)現(xiàn)windows模擬鼠標(biāo)及鍵盤動作
這篇文章主要介紹了用pywin32實(shí)現(xiàn)windows模擬鼠標(biāo)及鍵盤動作的示例,需要的朋友可以參考下 2014-04-04
-
Python Pydantic數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn)
本文主要介紹了Python Pydantic數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn) 2025-04-04
-
python 隊(duì)列基本定義與使用方法【初始化、賦值、判斷等】
這篇文章主要介紹了python 隊(duì)列基本定義與使用方法,結(jié)合實(shí)例形式分析了Python隊(duì)列的定義、初始化、賦值、判斷等相關(guān)操作技巧,需要的朋友可以參考下 2019-10-10
-
Python調(diào)用DeepSeek?API實(shí)現(xiàn)對本地數(shù)據(jù)庫的AI管理
這篇文章主要為大家詳細(xì)介紹了Python如何基于DeepSeek模型實(shí)現(xiàn)對本地數(shù)據(jù)庫的AI管理,文中的示例代碼簡潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下 2025-02-02
-
OpenCV學(xué)習(xí)方框?yàn)V波實(shí)現(xiàn)圖像處理代碼示例
這篇文章主要為大家介紹了OpenCV學(xué)習(xí)如何使用方框?yàn)V波實(shí)現(xiàn)對圖像處理代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步 2021-10-10
-
jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報錯
這篇文章主要介紹了jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報錯,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 2018-04-04
最新評論
前言
拓?fù)渑判蚴菆D論中一種重要的排序算法,用于對有向無環(huán)圖(DAG)進(jìn)行排序。在拓?fù)渑判蛑?,圖的頂點(diǎn)表示任務(wù),有向邊表示任務(wù)之間的依賴關(guān)系。拓?fù)渑判蛩惴梢哉业揭环N滿足所有任務(wù)依賴關(guān)系的順序。
算法原理
拓?fù)渑判蛩惴ǖ幕驹砣缦拢?/p>
- 創(chuàng)建一個空的排序結(jié)果列表。
- 找到圖中所有入度為0的頂點(diǎn)(即沒有依賴關(guān)系的頂點(diǎn)),將其加入排序結(jié)果列表。
- 移除該頂點(diǎn)以及與其相關(guān)的邊。
- 重復(fù)步驟2和3,直到圖中的所有頂點(diǎn)都被處理。
- 如果排序結(jié)果列表的長度等于圖中的頂點(diǎn)數(shù),則拓?fù)渑判虺晒?;否則,圖中存在環(huán),無法進(jìn)行拓?fù)渑判颉?/li>
Python實(shí)現(xiàn)
下面是使用Python實(shí)現(xiàn)拓?fù)渑判蛩惴ǖ氖纠a:
from collections import deque def topological_sort(graph): ? ? # 統(tǒng)計每個頂點(diǎn)的入度 ? ? in_degree = {v: 0 for v in graph} ? ? # 計算每個頂點(diǎn)的入度 ? ? for v in graph: ? ? ? ? for neighbor in graph[v]: ? ? ? ? ? ? in_degree[neighbor] += 1 ? ? # 將入度為0的頂點(diǎn)加入隊(duì)列 ? ? queue = deque([v for v in graph if in_degree[v] == 0]) ? ? # 保存拓?fù)渑判虻慕Y(jié)果 ? ? result = [] ? ? while queue: ? ? ? ? # 取出隊(duì)列中的頂點(diǎn) ? ? ? ? v = queue.popleft() ? ? ? ? result.append(v) ? ? ? ? # 移除頂點(diǎn)及其相關(guān)邊 ? ? ? ? for neighbor in graph[v]: ? ? ? ? ? ? in_degree[neighbor] -= 1 ? ? ? ? ? ? if in_degree[neighbor] == 0: ? ? ? ? ? ? ? ? queue.append(neighbor) ? ? # 判斷是否存在環(huán) ? ? if len(result) != len(graph): ? ? ? ? raise ValueError("圖中存在環(huán),無法進(jìn)行拓?fù)渑判颉?) ? ? return result # 測試 graph = { ? ? 'A': ['B', 'C'], ? ? 'B': ['D'], ? ? 'C': ['D', 'E'], ? ? 'D': ['F'], ? ? 'E': ['F'], ? ? 'F': [] } try: ? ? result = topological_sort(graph) ? ? print("拓?fù)渑判蚪Y(jié)果:", result) except ValueError as e: ? ? print(e)
以上代碼中,graph表示圖的鄰接表表示法,其中每個頂點(diǎn)表示為一個鍵,其對應(yīng)的值為一個列表,列表中存儲了與該頂點(diǎn)有直接邊相連的頂點(diǎn)。
運(yùn)行代碼后,將輸出拓?fù)渑判虻慕Y(jié)果。
這就是使用Python實(shí)現(xiàn)拓?fù)渑判蛩惴ǖ氖纠a。通過這個算法,我們可以對有向無環(huán)圖進(jìn)行
排序,找到滿足任務(wù)依賴關(guān)系的順序。
到此這篇關(guān)于Python實(shí)現(xiàn)拓?fù)渌惴ǖ氖纠奈恼戮徒榻B到這了,更多相關(guān)Python 拓?fù)渌惴▋?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用裝飾器click處理解析命令行參數(shù)
這篇文章主要為大家詳細(xì)介紹了Python如何利用裝飾器click實(shí)現(xiàn)處理解析命令行參數(shù)功能,文中的示例代碼簡潔易懂,需要的小伙伴快跟隨小編一起了解一下2022-10-10Python面試不修改數(shù)組找出重復(fù)的數(shù)字
這篇文章主要為大家介紹了不修改數(shù)組找出重復(fù)的數(shù)字Python實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05用pywin32實(shí)現(xiàn)windows模擬鼠標(biāo)及鍵盤動作
這篇文章主要介紹了用pywin32實(shí)現(xiàn)windows模擬鼠標(biāo)及鍵盤動作的示例,需要的朋友可以參考下2014-04-04Python Pydantic數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn)
本文主要介紹了Python Pydantic數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn)2025-04-04python 隊(duì)列基本定義與使用方法【初始化、賦值、判斷等】
這篇文章主要介紹了python 隊(duì)列基本定義與使用方法,結(jié)合實(shí)例形式分析了Python隊(duì)列的定義、初始化、賦值、判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-10-10Python調(diào)用DeepSeek?API實(shí)現(xiàn)對本地數(shù)據(jù)庫的AI管理
這篇文章主要為大家詳細(xì)介紹了Python如何基于DeepSeek模型實(shí)現(xiàn)對本地數(shù)據(jù)庫的AI管理,文中的示例代碼簡潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02OpenCV學(xué)習(xí)方框?yàn)V波實(shí)現(xiàn)圖像處理代碼示例
這篇文章主要為大家介紹了OpenCV學(xué)習(xí)如何使用方框?yàn)V波實(shí)現(xiàn)對圖像處理代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報錯
這篇文章主要介紹了jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報錯,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04