[英]DFS algorithm implementation in Python with classes
我正在嘗試實現 DFS,它將返回一個圖形,其中所有節點都包含它們的前身,同時具有顏色屬性來標識圖形中的循環(有一個循環當且僅當(u,v)是后邊當且僅當 v 是灰色的v.discovery < u.discovery)。
代碼:
# A class to represent a vertex object
class Vertex:
def __init__(self, val, color="white", d_time=-1, f_time=-1, pred=None):
self.val = val
self.color = color
self.d_time = d_time
self.f_time = f_time
self.pred = pred
# A class to represent a graph object
class Graph:
def __init__(self, adjDict):
self.vertexes = dict()
for vertex in adjDict:
self.vertexes[Vertex(vertex)] = [Vertex(neighbor) for neighbor in adjDict[vertex]]#problematic
def dfs(g):
for vertex in g.vertexes:
if vertex.color == "white":
dfs_vist(g, vertex)
return g
def dfs_vist(g, v, time=0):
time += 1
v.d_time = time
v.color = "gray"
for neighbor in g.vertexes[v]:
if neighbor.color == "white":
neighbor.pred = v
dfs_vist(g, neighbor, time)
v.color = "black"
time += 1
v.f_time = time
if __name__ == '__main__':
graph = {
0: [2, 4],
1: [],
2: [1, 5],
3: [8],
4: [7],
5: [4],
6: [3],
7: [1],
8: []
}
g = dfs(Graph(graph))
print(g)
當圖形表示為帶有鄰居列表的字典時,我正在嘗試初始化圖形。 錯誤出現在初始化階段:同一個頂點被創建了兩次,一次作為鄰居,一次作為鍵,然后 object 不同, g.vertexes[v]
導致鍵錯誤。 我想讓我的 dfs 和 dfs_visit 函數保持不變,是否可以對其進行初始化以使它們保持不變?
嘗試在您的圖形構造函數中執行此操作:
class Graph:
def __init__(self, adjDict):
self.vertexes = dict()
temp = {v: Vertex(v) for v in adjDict.keys()}
for vertex, neighbors in adjDict.items():
self.vertexes[temp[vertex]] = [temp[neighbor] for neighbor in neighbors]
如果在構建圖形之前創建所有頂點,然后將它們插入各自的位置,則可以避免重復重新創建相同的頂點。
這應該可以解決您創建重復頂點的問題,但我認為您的算法可能仍需要一些調整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.