簡體   English   中英

Python中的DFS算法實現與類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM