设计最短路径 用bfs 天然带最短路径

每一个状态是 当前的阶段 和已经访问过的节点

下面是正确但是超时的代码

class Solution:
def shortestPathLength(self, graph):
"""
:type graph: List[List[int]]
:rtype: int
"""
N=len(graph) Q=collections.deque([(1 << x, x) for x in range(N)])
D=collections.defaultdict(lambda:N*N) for i in range(N):
D[1<<i,i]=0 mask=0
#listr= [i for i in range(N)]
#random.shuffle(listr) for i in range(N):
mask=mask|1<<i while Q:
a,h=Q.popleft()
d=D[a,h] if(a==mask): return d for child in graph[h]: new_a=a |(1<<child) Q.append((new_a,child)) D[new_a,child]=min(d+1,D[new_a,child])

下面的代码稍微有优化,但是这种优化是非常好的。(值得思考的优化)

归根结底是因为没有考虑好一个状态是指什么。

在这里一个状态指的是, 以前便利过的节点 和 当前的节点。

有了这个节点状态

就不用把(到达这个节点的距离作为节点的一部分加入节点中,加入会引起性能损失)

到达这个节点的距离 单独存入一个数组中做优化 如果同一个状态后来的距离反而更长 那就丢弃。

class Solution:
def shortestPathLength(self, graph):
N=len(graph)
Q=collections.deque([(1 << x, x) for x in range(N)])
D=collections.defaultdict(lambda:N*N) for i in range(N):
D[1<<i,i]=0 mask=0
for i in range(N):
mask=mask|1<<i while Q:
cover,head=Q.popleft()
d=D[cover,head] if(cover==mask):
return d for child in graph[head]: new_a=cover |(1<<child) if(d+1<D[new_a,child]):
D[new_a,child]=d+1
Q.append((new_a,child))

动态规划算法

一个数组

state[ cover ][ head ] 表示当前状态所能达到的最小距离

head 维数的遍历顺序随意

cover 的遍历循序是从小到大

因为 new_cover=cover| child 这样的话内在隐含着一个内在的顺序

这样看来 这个题目有意卡掉了那些没有注意到这种顺序的方法

"relaxation step" (for those familiar with the Bellman-Ford algorithm)

复习 Bellman-Ford algorithm#

O(V*E)

1 初始化

2 n-1 次循环 每一个循环遍历每一个边 做 relaxtion step

3 额外判断是否每一条边都 存在优化空间

第i次循环 实际上是在寻找 单源最短路径

如果n-1 次循环后还能做 relaxtion step 那么说明图中存在 负权回路

leetcode 847. Shortest Path Visiting All Nodes 无向连通图遍历最短路径的更多相关文章

  1. [LeetCode] 847. Shortest Path Visiting All Nodes 访问所有结点的最短路径

    An undirected, connected graph of N nodes (labeled 0, 1, 2, ..., N-1) is given as graph. graph.lengt ...

  2. LeetCode 847. Shortest Path Visiting All Nodes

    题目链接:https://leetcode.com/problems/shortest-path-visiting-all-nodes/ 题意:已知一条无向图,问经过所有点的最短路径是多长,边权都为1 ...

  3. [Leetcode]847. Shortest Path Visiting All Nodes(BFS|DP)

    题解 题意 给出一个无向图,求遍历所有点的最小花费 分析 1.BFS,设置dis[status][k]表示遍历的点数状态为status,当前遍历到k的最小花费,一次BFS即可 2.使用DP 代码 // ...

  4. 【LeetCode】847. Shortest Path Visiting All Nodes 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/shortest ...

  5. 847. Shortest Path Visiting All Nodes

    An undirected, connected graph of N nodes (labeled 0, 1, 2, ..., N-1) is given as graph. graph.lengt ...

  6. [Swift]LeetCode847. 访问所有节点的最短路径 | Shortest Path Visiting All Nodes

    An undirected, connected graph of N nodes (labeled 0, 1, 2, ..., N-1) is given as graph. graph.lengt ...

  7. 最短路径遍历所有的节点 Shortest Path Visiting All Nodes

    2018-10-06 22:04:38 问题描述: 问题求解: 本题要求是求遍历所有节点的最短路径,由于本题中是没有要求一个节点只能访问一次的,也就是说可以访问一个节点多次,但是如果表征两次节点状态呢 ...

  8. AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)

    题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_C All Pairs Shortest Path Input ...

  9. LeetCode 1091. Shortest Path in Binary Matrix

    原题链接在这里:https://leetcode.com/problems/shortest-path-in-binary-matrix/ 题目: In an N by N square grid, ...

随机推荐

  1. day 65 Django基础之django分页

      Django基础之django分页   一.Django的内置分页器(paginator) view from django.shortcuts import render,HttpRespons ...

  2. 动态调整Log4j日志级别

    log4j2.xml配置文件中支持配置monitorInterval参数,检测到配置改变后重新加载,达到动态调整日志级别的效果. 故调整日志级别无须手动重启服务. log4j2.xml配置文件示意: ...

  3. java_static关键字

    /** * static关键字:静态关键字 * 静态优先于非静态加载到内存中(静态优先于对进入到内存中) * 被static修饰的成员变量不能被序列化的,序列化的都是对象 * transient关键字 ...

  4. 2019-10-4-C#-极限压缩-dotnet-core-控制台发布文件

    title author date CreateTime categories C# 极限压缩 dotnet core 控制台发布文件 lindexi 2019-10-04 14:59:36 +080 ...

  5. db.Database.SqlQuery完成分页封装

    调用代码: string sql = @"SELECT a.Id ,c.Title,a.Content,a.Status,b.ReportSum FROM dbo.Comment AS a ...

  6. 锋利的Jquery(点击显示隐藏div)

    点击显示隐藏div <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  7. Leetcode187. Repeated DNA Sequences重复的DNA序列

    所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:"ACGAATTCCG".在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助. 编写一个函数 ...

  8. php实现在不同国家显示网站的不同语言版本

    首先,你的网站本身要拥有多个语言版本.不然的话你就只能用JS去转化了. 1.通过ip去定位,这个要引用到第三方的接口进行数据的完整返回,但是不知道是我的网速太慢还是什么原因,个人觉得这个方法会卡顿: ...

  9. tbody设置超出固定的高度出现滚动条,没超出不显示。

    没有超出时显示样式,不显示滚动条: 超出时显示滚动条: 1.html <table class="table"> <thead> <tr> &l ...

  10. zabbix被监控端代理设置

    zabbix被监控端代理设置 安装zabbix-agent客户端 rpm -ivh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-re ...