使用 Python 判斷是否存在長度大於 k 的路徑
假設我們有一個圖,一個源頂點和一個數字 k。k 是圖中源點到目標點之間路徑的長度,我們需要檢查是否可以找到從源點開始到任何其他頂點(作為目標點)的簡單路徑(無環)。該圖如下所示:

因此,如果輸入為 Source = 0,k = 64,則輸出為 True,因為存在一條從 0 到 7 到 1 到 2 到 8 到 6 到 5 到 3 到 4 的簡單路徑,這條路徑的總距離為 68,大於 64。
為了解決這個問題,我們將遵循以下步驟:
使用 nodes x nodes 階的鄰接矩陣 adj 定義圖,並填充邊權重。
定義一個函式 solve()。它將接收源點、k 和路徑。
如果 k <= 0,則
返回 True
i := 0
當 i 不等於 adj[source] 的大小之前,執行:
v := adj[source, i, 0]
w := adj[source, i, 1]
i := i + 1
如果 path[v] 為 True,則
跳過本次迭代
如果 w >= k,則
返回 True
path[v] := True
如果 solve(v, k-w, path) 為真,則
返回 True
path[v] := False
返回 False
在主方法中,執行以下操作:
path := 一個大小與 nodes 相同的列表,然後填充假值
path[source] := 1
返回 solve(source, k, path)
示例
讓我們來看一下以下實現,以便更好地理解:
class Graph: def __init__(self, nodes): self.nodes = nodes self.adj = [[] for i in range(nodes)] def insert_edge(self,u, v, w): self.adj[u].append([v, w]) self.adj[v].append([u, w]) def solve(self,source, k, path): if (k <= 0): return True i = 0 while i != len(self.adj[source]): v = self.adj[source][i][0] w = self.adj[source][i][1] i += 1 if (path[v] == True): continue if (w >= k): return True path[v] = True if (self.solve(v, k-w, path)): return True path[v] = False return False def is_there_any_path(self,source, k): path = [False]*self.nodes path[source] = 1 return self.solve(source, k, path) nodes = 9 g = Graph(nodes) g.insert_edge(0, 1, 5) g.insert_edge(0, 7, 9) g.insert_edge(1, 2, 9) g.insert_edge(1, 7, 12) g.insert_edge(2, 3, 8) g.insert_edge(2, 8, 3) g.insert_edge(2, 5, 5) g.insert_edge(3, 4, 10) g.insert_edge(3, 5, 15) g.insert_edge(4, 5, 11) g.insert_edge(5, 6, 3) g.insert_edge(6, 7, 2) g.insert_edge(6, 8, 7) g.insert_edge(7, 8, 8) source = 0 k = 64 print(g.is_there_any_path(source, k))
輸入
nodes = 9 g = Graph(nodes) g.insert_edge(0, 1, 5) g.insert_edge(0, 7, 9) g.insert_edge(1, 2, 9) g.insert_edge(1, 7, 12) g.insert_edge(2, 3, 8) g.insert_edge(2, 8, 3) g.insert_edge(2, 5, 5) g.insert_edge(3, 4, 10) g.insert_edge(3, 5, 15) g.insert_edge(4, 5, 11) g.insert_edge(5, 6, 3) g.insert_edge(6, 7, 2) g.insert_edge(6, 8, 7) g.insert_edge(7, 8, 8) source = 0 k = 64
輸出
True
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP