克隆一张无向图,图中的每个节点包含一个 label
和一个列表 neighbors
。
数据中如何表示一个无向图?http://www.lintcode.com/help/graph/
你的程序需要返回一个经过深度拷贝的新图。这个新图和原图具有同样的结构,并且对新图的任何改动不会对原图造成任何影响。
样例
比如,序列化图 {0,1,2#1,2#2,2}
共有三个节点, 因此包含两个个分隔符#。
- 第一个节点label为0,存在边从节点0链接到节点1和节点2
- 第二个节点label为1,存在边从节点1连接到节点2
- 第三个节点label为2,存在边从节点2连接到节点2(本身),从而形成自环。
我们能看到如下的图:
1
/ \
/ \
0 --- 2
/ \
\_/
这一题的思路就是,1、先复制结点 2、复制边 讲解我写在注释里了:
class UndirectedGraphNode:
def __init__(self, x):
self.label = x
self.neighbors = []
class Solution:
"""
@param: node: A undirected graph node
@return: A undirected graph node
"""
def cloneGraph(self, node):
# write your code here
if (node is None): return node
# 首先复制所有结点
from queue import Queue
q = Queue()
traversal = set()
q.put(node)
traversal.add(node)
dic = {} # 用来对应新老结点
while (q.qsize() != 0): # 遍历图
nodeold = q.get()
nodenew = UndirectedGraphNode(nodeold.label) # 复制结点
dic[nodeold] = nodenew
for neighbor in nodeold.neighbors:
if (neighbor in traversal):
continue
q.put(neighbor)
traversal.add(neighbor)
for nodeold in traversal: # 复制边
nodenew = dic[nodeold]
for neighbor in nodeold.neighbors:
neighbornew = dic[neighbor]
nodenew.neighbors.append(neighbornew)
return dic[node]
g = UndirectedGraphNode(-1)
g2 = UndirectedGraphNode(1)
g.neighbors = [g2]
print(g.neighbors[0].label)
s = Solution()
print(s.cloneGraph(g).neighbors[0].label)