[leetcode]Clone Graph @ Python

原題地址:https://oj.leetcode.com/problems/clone-graph/node

題意:實現對一個圖的深拷貝。數組

解題思路:因爲遍歷一個圖有兩種方式:bfs和dfs。因此深拷貝一個圖也能夠採用這兩種方法。無論使用dfs仍是bfs都須要一個哈希表map來存儲原圖中的節點和新圖中的節點的一一映射。map的做用在於替代bfs和dfs中的visit數組,一旦map中出現了映射關係,就說明已經複製完成,也就是已經訪問過了。app

dfs代碼:spa

# Definition for a undirected graph node
# class UndirectedGraphNode:
#     def __init__(self, x):
#         self.label = x
#         self.neighbors = []

class Solution:
    # @param node, a undirected graph node
    # @return a undirected graph node
    # @BFS
    def cloneGraph(self, node):
        def dfs(input, map):
            if input in map:
                return map[input]
            output = UndirectedGraphNode(input.label)
            map[input] = output
            for neighbor in input.neighbors:
                output.neighbors.append(dfs(neighbor, map))
            return output
        if node == None: return None
        return dfs(node, {})

bfs代碼:code

# Definition for a undirected graph node
# class UndirectedGraphNode:
#     def __init__(self, x):
#         self.label = x
#         self.neighbors = []

class Solution:
    # @param node, a undirected graph node
    # @return a undirected graph node
    # @BFS
    def cloneGraph(self, node):
        if node == None: return None
        queue = []; map = {}
        newhead = UndirectedGraphNode(node.label)
        queue.append(node)
        map[node] = newhead
        while queue:
            curr = queue.pop()
            for neighbor in curr.neighbors:
                if neighbor not in map:
                    copy = UndirectedGraphNode(neighbor.label)
                    map[curr].neighbors.append(copy)
                    map[neighbor] = copy
                    queue.append(neighbor)
                else:
                    # turn directed graph to undirected graph
                    map[curr].neighbors.append(map[neighbor])
        return newhead
相關文章
相關標籤/搜索