题目:

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的更多相关文章

  1. 【LeetCode】堆 heap(共31题)

    链接:https://leetcode.com/tag/heap/ [23] Merge k Sorted Lists [215] Kth Largest Element in an Array (无 ...

  2. 【LeetCode】BFS(共43题)

    [101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较 ...

  3. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

  4. 【LeetCode】图论 graph(共20题)

    [133]Clone Graph (2019年3月9日,复习) 给定一个图,返回它的深拷贝. 题解:dfs 或者 bfs 都可以 /* // Definition for a Node. class ...

  5. 【LeetCode】743. Network Delay Time 解题报告(Python)

    [LeetCode]743. Network Delay Time 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...

  6. 【LeetCode】代码模板,刷题必会

    目录 二分查找 排序的写法 BFS的写法 DFS的写法 回溯法 树 递归 迭代 前序遍历 中序遍历 后序遍历 构建完全二叉树 并查集 前缀树 图遍历 Dijkstra算法 Floyd-Warshall ...

  7. 【LeetCode】449. Serialize and Deserialize BST 解题报告(Python)

    [LeetCode]449. Serialize and Deserialize BST 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/pro ...

  8. 【LeetCode】297. Serialize and Deserialize Binary Tree 解题报告(Python)

    [LeetCode]297. Serialize and Deserialize Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode ...

  9. 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java

    [LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...

随机推荐

  1. win10电脑休眠后无法唤醒的解决办法

    电脑的休眠功能,为长时间不用的电脑进行了关闭显示.硬盘停转的深度节能模式,不仅节约能源,还保护设备. 但有些时候也会出现一些问题,如休眠后无法唤醒,无法移动鼠标,敲击键盘都无效,最后只能长按电源键来强 ...

  2. tomcat7远程代码执行 ImageMagick 命令执行漏洞

    tomcat7远程代码执行 windows     / linux   ::$DATA ImageMagick 命令执行漏洞(CVE-2016–3714) base64编码

  3. 图片下载&&非同源图片下载&&同源下载&&网页点击下载图片

    非同源图片下载(html添加canvas标签) 方法1: downloadImgByBase64(url){ console.log() // 创建隐藏的可下载链接   // let  blob = ...

  4. mysql——多表——内连接查询

    内连接查询:可以查询两个或者两个以上的表,当两个表中存在表示相同意义的字段时,可以通过该字段来连接这两个表: 当该字段的值相等时,就查询出该记录. 前期准备两个表: ), d_id ), name ) ...

  5. javascript 数据类型之数值转换

    数值转换 一.有3个函数可以把非数值转换为数值: Number() parse Int() parse Float() 说明: 1.Number()可以用于任何数据类型,强转类型,如果不能把指转成数值 ...

  6. ios模拟器快捷键

    shift+cmd+h  返回桌面 cmd+5或者4或者3  可以直接调节大小 cmd+R运行项目 cmd+R弹出键盘 ios模拟器弹出键盘 在xcode6中, 模拟器中的键盘和电脑的键盘可以进行绑定 ...

  7. Qt - 基于UDP的网络编程

    UDP(用户数据报协议 User Data Protocol) 轻量级.不可靠.面向数据报.无连接  的传输层协议. 适用情况: 网络数据大多为短消息: 拥有大量客户端: 对数据安全无特殊要求: 网络 ...

  8. 理解ES6的模块导入与导出

    export export后必须跟语句, 何为语句, 如声明, for, if 等都是语句, export 不能导出匿名函数, 也不能导出某个已经声明的变量, 如: export const bar ...

  9. multiplication_puzzle(区间dp)

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  10. 利用BFS解决拯救007问题 -- 数据结构

    题目: 7-1 拯救007 (30 分) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接 ...