题目链接
给定一个树形关系结构
只有一个根节点headID
求从headID到叶子节点的最长路径
反向去想,以每个叶子节点为起点,累加其到达headID节点的权重,若累加过程发现到达途径点x累积权重没有别的叶子节点经过该x点的权重高,则停止累积(也可以成为停止松弛)
有一些最短路算法SPFA的思想
若有N个节点
时间复杂度
O(N ^ 2)
Runtime: 160 ms (beats 97.41%)
Memory Usage: 9.1 MB
func numOfMinutes(n int, headID int, manager []int, informTime []int) int {
costs := make([]int, len(manager))
exist := make([]bool, len(manager))
for _, v := range manager {
if v == -1 {
exist[headID] = true
} else {
exist[v] = true
}
}
var calcCosts func(src int)
calcCosts = func(src int) {
if src == headID {
return
}
if informTime[manager[src]] + costs[src] > costs[manager[src]] {
costs[manager[src]] = informTime[manager[src]] + costs[src]
calcCosts(manager[src])
}
}
for i, v := range exist {
if !v {
calcCosts(i)
}
}
return costs[headID]
}