题目:

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. 【ABAP系列】SAP 一个完整的SAP的Abap例子(idoc,edi文件的相互转换)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 一个完整的SAP的Aba ...

  2. js --- ffmpeg rtsp 推流,websocket通信,cnavas 渲染

    首先选择正确的ffmpeg包 百度搜索ffmpeg官网,点击进入下图所示. 点击download,进入下载页面,选择window,window下面只有一个builds版本,如图红线部分圈出来的 点击b ...

  3. [ASP.NET] 后台判断文本框输入内容是否为数字

    由于使用JS在前台对文本框内容进行检测后似乎会影响回传 故在后端进行对内容判断 代码示例: string abnormal_num = Abnormal_Num.Text;//獲取文本框的text值 ...

  4. Linux系统中使用Nignx配置反向代理负载均衡

    目录 使用nginx实现动静分离的负载均衡集群 使用nginx实现负载均衡和动静分离 使用nginx实现动静分离的负载均衡集群 Nginx官网源码包下载链接:http://nginx.org/en/d ...

  5. 快速乘+快速幂(用于模数超过int范围)

    一般的快速幂并不适合模数大于int范围的情况,因为在乘法运算的过程可能会出现超出long long的情况出现.这个时候可以利用快速幂的思想使用快速乘,原理就是模拟乘法运算,将乘法运算分解成加法运算,再 ...

  6. awk 命令使用指南

    一:awk 的执行流程 (1) 首先执行BEGIN{} 块中的初始化操作 (2) 然后从指定的数据文件中循环读取一个数据行 ( 自动更新 NF.NR.$0.$1....., 等内建变量的值) (3) ...

  7. javaweb: request.getParameter()、request.setAttribute()与request.getAttribute()的作用 (转)

    出处:https://blog.csdn.net/qq_41937388/article/details/87972914 1.request.getParameter()方法是获取通过类似post, ...

  8. 利用aopc创建schema失败

    执行neo4j-graph-algorithms的例子,运行以下代码报错: CALL apoc.schema.assert( {Category:['name']}, {Business:['id'] ...

  9. 19.AutoMapper 之开放式泛型(Open Generics)

    https://www.jianshu.com/p/ce4c7e291408 开放式泛型(Open Generics) AutoMapper可以支持开放式泛型的映射.为开放式泛型创建映射: publi ...

  10. npm学习(十)之如何使用创建、发布、使用作用域包

    前言 要求npm版本2或更高 作用域用于将相关包分组在一起,并为npm模块创建一个名称空间(类似于域).这里有更详细的解释. 如果一个包的名称以@开头,那么它就是一个有作用域的包.范围是@和斜杠之间的 ...