栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Acwing:树的最长路径(树形DP 树的直径 Python详细注释)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Acwing:树的最长路径(树形DP 树的直径 Python详细注释)

题目描述:

给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。

现在请你找到树中的一条最长路径。

换句话说,要找到一条路径,使得使得路径两端的点的距离最远。

注意:路径中可以只包含一个点。

输入格式

第一行包含整数 n。

接下来 n−1 行,每行包含三个整数 ai,bi,ci,表示点 ai 和 bi 之间存在一条权值为 ci 的边。

输出格式

输出一个整数,表示树的最长路径的长度。

数据范围

1≤n≤10000,
1≤ai,bi≤n,
−10^5≤ci≤10^5

输入样例:

6
5 1 6
1 4 5
6 3 9
2 6 8
6 1 7

输出样例:

22
分析:

dp算法: 以任何一个点出发, 找到距离该点最远的2条路径, 加起来就是结果. 由于用的是无向边, 所以dfs能够遍历到所有点所有边, 只需要把结果用全局变量更新即可.

简略证明: 
1. 首先假设起点在最长路径上, 显然能得到最佳结果; 
2. 而假设起点不在最长路径上, 那么在dfs走到最长路径上的某一点之前, 该条路径都不会是最长路径的一部分,
那么在到达最长路径上的某个点的时候也不会因为father的限制导致冲突, 所以到达那个点之后就还能正常算出最终结果.

 AC代码 (Python3)

N = int(input())
Map = [dict() for i in range(N+1)] 
# 注意这里空间卡的很死 必须要用邻接表来存图 用邻接矩阵会MLE
for i in range(N-1) : 
    come,to,weight = map(int,input().split())
    Map[come][to] = weight
    Map[to][come] = weight
    
ans = 0

def dfs(now_node,father) : # 当前节点 当前节点的父节点
    global ans
    dis = 0 # 当前节点能走到最远距离
    d1,d2 = 0,0 # 最长路径 ,次长路径
    tmp = 0 # 临时变量存距离
    
    for i in Map[now_node].keys() :
        if i == father :
            continue
        tmp = dfs(i,now_node) + Map[now_node][i] # 当儿子节点能走到的最远距离 + 当前节点到儿子节点的距离
        dis = max(dis,tmp) # 更新当前节点能走到的最远距离
        if tmp > d1 : d2 = d1 ; d1 = tmp # 更新最长路径
        elif tmp > d2 : d2 = tmp # 更新次长路径
            
    ans = max(ans,d1+d2) # 更新答案
    return dis
            
dfs(1,-1) # 开始搜索 从任意一个节点开始即可 父节点处初始设为-1
print(ans)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934543.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号