"""
设计:Python程序设计
作者:初学者
日期:2022年 05月 06日
"""
# 例115 克隆图
# 1.问题描述
# 克隆一张无向图,图中的每个节点包含一个label和neighbors。
# 保证每个节点的label均不同。返回一个经过深度复制的新图,这个新图和原图俱有同样的结构,
# 并且对新图的改动不会对原图造成影响。
# 2。问题示例
# 序列化图{0,1,2,#1,2#2,2}共有三个节点,包含2个分隔符#。第一个节点label为0,
# 存在这边从节点0链接到节点1和节点2;第二个节点2;第二个节点label为1,存在这边从节点1
# 链接到点2;第三个节点label为2,存在这边从节点2链接到2本身,从而形成自环。
# 3.代码实现
# 定义无向图节点
class UndigraphNode:
def __init__(self, x):
self.label = x
self.neighbors = []
class Soiution:
def __init__(self):
self.dict = {}
"""
参数node:无向图节点
返回值:无向图节点
"""
def depth_copy(self, node):
if node is None:
return None
if node.label in self.dict:
return self.dict[node.label]
root = UndigraphNode(node.label)
self.dict[node.label] = root
for item in node.neighbors:
root.neighbors.append(self.depth_copy(item))
return root
# 主函数
if __name__ == '__main__':
s = Soiution()
g0 = UndigraphNode(0)
g1 = UndigraphNode(1)
g2 = UndigraphNode(2)
g0.neighbors = [g1, g2]
g1.neighbors = [g2]
g2.neighbors = [g2]
ans = s.depth_copy(g0)
a = [ans.label, ans.neighbors[0].label, ans.neighbors[1].label, ans.neighbors[0].neighbors[0].label,
ans.neighbors[1].neighbors[0].label]
print("输入:{0,1,2#1,2#2,2}")
print("输出:", a)
05-19