【面试代码题记录】建图+寻路

面试题目
上图是面试被问到的题目,平常做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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值