【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 ...
随机推荐
- vc/vs常见报错:/****error C2106: '=' : left operand must be l-value****/
一.错误信息解析: 1.error,表示这是一条出错信息. C语言信息一般有error(出错)和warning(警告)两种. error是编译器遇到了致命错误,无法继续进行编译,必须修改. warni ...
- nginx配置laravel项目
在/etc/nginx/conf.d下新建一个laravel.conf文件,并编辑 写入如下文件即可 server { listen 80; server_name xxx; root "/ ...
- cf1151e number of components
很常见的思想:将整体求改为统计每个部分的贡献 本题中统计[l, r]时, 每个连通块有一个重要特征, 最右端的数在[l,r]中而下一个数不在(好像是句废话 那么我们分别考虑每个点对连通块的贡献, 即它 ...
- TCP端口扫描
# TCP三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1 ...
- CF 1178E Archaeology 题解
题面 这道题竟然是E?还是洛谷中的黑题? wow~!! 于是就做了一下: 然后一下就A了:(这并不代表想的容易,而是写的容易) 这道题就是骗人的!! 什么manacher,什么回文自动机,去靠一边站着 ...
- Nginx教程(一)-全面认知
什么是 nginx nginx 是一款高性能的 http 服务器,反向代理服务器,电子邮件(IMAP/POP3)代理服务器: 它的特点就是高性能,占用内存少,支持高并发,运行稳定: 官方测试 可支持 ...
- Kafka 教程(二)-安装与基础操作
单机安装 1. 安装 java 2. 安装 zookeeper [这一步可以没有,因为 kafka 自带了 zookeeper] 3. 安装 kafka 下载链接 kafka kafka 是 scal ...
- ElasticSearch基础知识讲解
第一节 ElasticSearch概述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfull web接口.ElasticSea ...
- JavaSE--关键字
关键字 1.static 属于成员修饰符,被静态修饰符修饰的成员要使用类名直接调用,该成员优先于对象存在,属于类且被所有实例化对象共享,静态成员随着类的加载而加载. 访问权限:静态成员优先于对象加载致 ...
- linux复习3:linux字符界面的操作
一.前言 1.对linux服务器进行管理的时候,经常要进入字符界面进行操作,使用命令需要记住该命令的相关选项和参数.vi编辑器可以用于编辑任何ASCII文本,功能非常的强大,可以对文本进行创建.查找. ...