【leetcode】Network Delay Time
题目:
There are N network nodes, labelled 1 to N. Given times, a list of travel times as directed edges times[i] = (u, v, w), where u is the source node, v is the target node, and w is the time it takes for a signal to travel from source to target. Now, we send a signal from a certain node K. How long will it take for all nodes to receive the signal? If it is impossible, return -1. Note:
N will be in the range [1, 100].
K will be in the range [1, N].
The length of times will be in the range [1, 6000].
All edges times[i] = (u, v, w) will have 1 <= u, v <= N and 1 <= w <= 100.
解题思路:
本题很像是树的遍历,找出离根节点最远的叶子节点。但是与树不一样的是,节点之间存在回路。如图我是构造的一组测试数据。我的想法是从根节点开始,首先找出与根节点有直通的第一层节点并将这一层所有节点入栈,同时用一个数组保存根节点与每个节点的最短延时。
1. 首先为节点定义结构体
class Node(object):
def __init__(self, inx):
self.inx = inx #节点序号
self.childList = [] #所有与之直连的节点列表
self.childDis = [] #到达直接节点的最小延时,下标与childList下标一致
2.遍历times,建立节点之间的直连关系
nodeList = [None for x in range(N+1)]
for i in times:
if nodeList[i[0]] == None:
node = Node(i[0]);
node.childList.append(i[1])
node.childDis.append(i[2])
nodeList[i[0]] = node
#print node.inx,node.childList,node.childDis
#print nodeList[i[0]].inx,nodeList[i[0]].childList,nodeList[i[0]].childDis
else:
nodeList[i[0]].childList.append(i[1])
nodeList[i[0]].childDis.append(i[2])
3.从K节点开始寻找最大延时节点,将过程中遍历到的节点入栈(类似广度遍历的思想),找出K能到达的所有节点,并用数组dp记录最短延时。
dp = [6001 for x in range(N+1)]
dp[0] = dp[K]= 0
stack = []
stack.append(K)
visit = set()
visit.add(K)
while len(stack) > 0:
tmp = stack.pop(0)
if nodeList[tmp] == None:
continue
for i in range(len(nodeList[tmp].childList)):
if dp[nodeList[tmp].childList[i]] > nodeList[tmp].childDis[i] + dp[tmp]: #注,这里是关键一步,判断是否有更小延时路径
dp[nodeList[tmp].childList[i]] = nodeList[tmp].childDis[i] + dp[tmp]
if nodeList[tmp].childList[i] not in visit:
visit.add(nodeList[tmp].childList[i])
完整代码如下:
class Node(object):
def __init__(self, inx):
self.inx = inx
self.childList = []
self.childDis = []
class Solution(object):
def networkDelayTime3(self, times, N, K):
#build level relation
nodeList = [None for x in range(N+1)]
for i in times:
if nodeList[i[0]] == None:
node = Node(i[0]);
node.childList.append(i[1])
node.childDis.append(i[2])
nodeList[i[0]] = node
#print node.inx,node.childList,node.childDis
#print nodeList[i[0]].inx,nodeList[i[0]].childList,nodeList[i[0]].childDis
else:
nodeList[i[0]].childList.append(i[1])
nodeList[i[0]].childDis.append(i[2]) dp = [6001 for x in range(N+1)]
dp[0] = dp[K]= 0
stack = []
stack.append(K)
visit = set()
visit.add(K)
while len(stack) > 0:
tmp = stack.pop(0)
if nodeList[tmp] == None:
continue
for i in range(len(nodeList[tmp].childList)):
if dp[nodeList[tmp].childList[i]] > nodeList[tmp].childDis[i] + dp[tmp]:
dp[nodeList[tmp].childList[i]] = nodeList[tmp].childDis[i] + dp[tmp]
if nodeList[tmp].childList[i] not in visit:
visit.add(nodeList[tmp].childList[i])
stack.append(nodeList[tmp].childList[i]) #print dp
if 6001 in dp:
return -1
else:
res = dp[1]
for i in range(1,len(dp)):
if res < dp[i]:
res = dp[i]
return res
【leetcode】Network Delay Time的更多相关文章
- 【LeetCode】堆 heap(共31题)
链接:https://leetcode.com/tag/heap/ [23] Merge k Sorted Lists [215] Kth Largest Element in an Array (无 ...
- 【LeetCode】BFS(共43题)
[101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较 ...
- 【LeetCode】深搜DFS(共85题)
[98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...
- 【LeetCode】图论 graph(共20题)
[133]Clone Graph (2019年3月9日,复习) 给定一个图,返回它的深拷贝. 题解:dfs 或者 bfs 都可以 /* // Definition for a Node. class ...
- 【LeetCode】743. Network Delay Time 解题报告(Python)
[LeetCode]743. Network Delay Time 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...
- 【LeetCode】代码模板,刷题必会
目录 二分查找 排序的写法 BFS的写法 DFS的写法 回溯法 树 递归 迭代 前序遍历 中序遍历 后序遍历 构建完全二叉树 并查集 前缀树 图遍历 Dijkstra算法 Floyd-Warshall ...
- 【LeetCode】449. Serialize and Deserialize BST 解题报告(Python)
[LeetCode]449. Serialize and Deserialize BST 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/pro ...
- 【LeetCode】297. Serialize and Deserialize Binary Tree 解题报告(Python)
[LeetCode]297. Serialize and Deserialize Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode ...
- 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
[LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...
随机推荐
- A1139-引爆炸弹 计蒜客 bfs剪枝
题目链接 https://nanti.jisuanke.com/t/A1139 在一个 n \times mn×m 的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上 ...
- JavaScript Array Reduce用于数组求和
需求一 假设有一个数组,需要对其中的元素进行求和. const numbers = [1, -1, 2, 3]; 传统写法,使用for循环求和 const numbers = [1, -1, 2, 3 ...
- 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解
题面 这道题是一道标准的01分数规划: 但是有一些细节可以优化: 不难想到要二分一个mid然后判定图上是否存在一个环S,该环是否满足∑i=1t(Fun[vi]−mid∗Tim[ei])>0 但是 ...
- PythonDay13
第十三章 今日内容 匿名函数 内置函数二 闭包 匿名函数 匿名函数就是一行函数,关键字是lambda lambda x:x# lambda 参数:返回值x 是普通函数的形参 可以不定义形参:x 是 普 ...
- logging模块及日志框架
logging模块及日志框架 logging模块 一.导入方式 import logging 二.作用 写日志 三.模块功能 3.1 经常使用 # V1 import logging logging ...
- ckfinder的使用
引入<script type="text/javascript" src="${ctxStatic}/ckfinder/ckfinder.js">& ...
- luogu P1758 [NOI2009]管道取珠
luogu 这个题中的平方有点东西,考虑他的组合意义,也就是做这个过程两次,如果两次得到的结果一样就给答案+1,所以可以考虑dp,设\(f_{i,j,k,l}\)表示第一个过程中上面取到的第\(i\) ...
- clientXxx与offsetXxx与scrollXxx区别
1.clientXxx与offsetXxx与scrollXxx 1.clientXxx: clientWidth = width+padding(left+right) clientHeight = ...
- 关于一个function abc() 内 return一个值, 或者多个值写法
1.想return一个值,选第一种写法 function abc(){ a = '我是adad' return a } console.log(abc) // ==> 这个是错的,不要这样写,经 ...
- 【Java】 Java常用的几个设计模式实例
一.单例模式 public class SingletonDemo { public static void main(String[] args) { // } } class User1{//饿汉 ...