原題地址:https://oj.leetcode.com/problems/clone-graph/
題意:實現對一個圖的深拷貝。
解題思路:由於遍歷一個圖有兩種方式:bfs和dfs。所以深拷貝一個圖也可以采用這兩種方法。不管使用dfs還是bfs都需要一個哈希表map來存儲原圖中的節點和新圖中的節點的一一映射。map的作用在於替代bfs和dfs中的visit數組,一旦map中出現了映射關系,就說明已經復制完成,也就是已經訪問過了。
dfs代碼:
# 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代碼:
# 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