上图是面试被问到的题目,平常做leetcode不要自己建图,所以建图写起来比较生疏,记录一下,帮助记忆。
输入的数据结构:
lst = [[1,2,3],[1,3,2],[1,4,1],[2,5,2],[3,6,1],[4,6,4],[4,5,3],[6,5,3]] #[node1,node2,distance_12]
#建立Node类,包括node_id和node的子节点id集合children
class Node:
def __init__(self,node_id,children):
self.node_id = node_id
if children:
self.children = children
else:
self.children = None
#建立Graph对象,关键信息为nodes{node_id:class_Node}和arcs{(node1_id,node2_id):distance_12}
class Graph:
def __init__(self,lst):
self.nodes = {}
self.arcs = {}
self.temp = {}
for el in lst:
n1 = el[0]
n2 = el[1]
dis = el[2]
if n1 not in self.temp.keys():
self.temp[n1] = [n2]
else:
self.temp[n1].append(n2)
if n2 not in self.temp.keys():
self.temp[n2] = []
self.arcs[(n1,n2)] = dis
self.arcs[(n2,n1)] = dis
for k,v in self.temp.items():
self.nodes[k] = Node(k,v)
#寻路,使用回溯
def search(graph):
def dfs(node,length,res,graph):
if node.node_id == 5:
res.append(length)
return
children = node.children
for child in children:
dfs(graph.nodes[child],length+graph.arcs[(node.node_id,child)],res,graph)
res = []
dfs(graph.nodes[1],0,res,graph)
return res
#调用求解
lst = [[1,2,3],[1,3,2],[1,4,1],[2,5,2],[3,6,1],[4,6,4],[4,5,3],[6,5,3]]
g = Graph(lst)
res = search(g)
#结果
res = [5,6,8,4]