美团2019秋招笔试—图的遍历

本文探讨了在N个节点、N-1个边的无向连通图中寻找最短路径的方法,通过生成树的概念,阐述了如何确定最大深度,并基于此计算最短总路程,提供了一段Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

思路:N个节点,N -1个边,且无向连通图,每次从1开始遍历,说明是生成树;则最长的边遍历一次,其他的边遍历两次,则能使得路程最短;首先求得最大深度m,然后就可以得到路程m + (N-1-m)*2;

代码:

n =7
edge = [[1,2],[2,3],[2,4],[3,6],[6,7],[3,5]]

from collections import defaultdict

d = defaultdict(list)
for i in edge:
    d[i[0]].append(i[1])
    d[i[1]].append(i[0])

visited = [False] * (n + 1)
deep = [0] * (n + 1)
parent = [-1] * (n + 1)

def recursion(d, node, deep_tmp):
    deep_tmp += 1
    visited[node] = True
    if d[node] == []:
        return 
    for i in d[node]:
        if visited[i] == False:
            deep[i] = deep_tmp
            parent[i] = node
            recursion(d, i, deep_tmp)
recursion(d, 1, 0)
max_deep = max(deep)
print(max_deep + 2 * (n - 1 - max_deep))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值