LeetCode Clone Graph

2946 ワード

LeetCode解題のClone Graph
原題
無方向図をコピーします.図の各ノードには、独自のラベルと隣接するノードのリストがあります.
注意点:
  • なし
    例:
    入力:
           1
          / \
         /   \
        0 --- 2
             / \
             \_/

    出力:
           1
          / \
         /   \
        0 --- 2
             / \
             \_/

    問題を解く構想.
    図にループが存在する可能性があるため、ノードとその隣接ノードを直接コピーし、その隣接ノードを同じ操作でデッドサイクルに入る可能性があります.ループ・アクセスを回避するために、コピーしたノードをキャッシュするには、フラグとノードからなる辞書を使用して、アクセスしたノードを記録します.隣接関係を介してノードにアクセスする場合、初めてアクセスされた場合は、スタックに追加します.スタック内の要素は、隣接する要素にアクセスし続けることを示し、アクセスされたことを記録し、新しくアクセスされたノードと隣接するノードの隣接リストを記録します.スタックが空の場合、すべてのノードがアクセス済みであり、図もコピーに成功したことを示します.
    ACソース
    # Definition for a undirected graph node
    class UndirectedGraphNode(object):
        def __init__(self, x):
            self.label = x
            self.neighbors = []
    
    
    class Solution(object):
        def cloneGraph(self, node):
            """
            :type node: UndirectedGraphNode
            :rtype: UndirectedGraphNode
            """
            if not node:
                return node
            visited = {}
            first = UndirectedGraphNode(node.label)
            visited[node.label] = first
            stack = [node]
            while stack:
                top = stack.pop()
                for n in top.neighbors:
                    if n.label not in visited:
                        visited[n.label] = UndirectedGraphNode(n.label)
                        stack.append(n)
                    visited[top.label].neighbors.append(visited[n.label])
            return first
    
    
    if __name__ == "__main__":
        None

    私のGithub(https://github.com/gavinfish/LeetCode-Python)を使用して、関連するソースコードを取得します.