847. Shortest Path Visiting All Nodes(二)

输入:有N个节点的无向图,每个节点被标注为0,1,…N-1。graph[i][j]表示从节点i到节点j有一条边。
输出:每个节点都访问一次,至少需要几步。
规则:可以重复访问一个节点。
分析:这道题目看了2个星期。其实这两周也是因为加班,没有再看新的题目。在地铁上没事,就把官方的解法方式拿出来看看。发现另有感悟。体会到了书读百遍其义自见。
 我们需要返回沿着边走完N个节点需要几步。因为我们可以从任意一个节点开始走。所以我们可以先问从节点0开始,走几步能访问了所有的节点。如果我们知道这个答案,那么我们分别计算从0,1,2…N-1开始,需要几步。取最小值就是答案。
 输入示例:[[1,2,3],[0],[0],[0]]
 先计算从一个节点开始。假设从节点0开始。可能的路径:节点0->节点1->?,之后需要再经过节点0,才有出路。我认为这道题目难的地方在于,之前为了防止重复访问,一个元素被访问之后做个标记,就可以。但是这里不可以。节点0->节点1->节点0->?如果此时再访问节点1,那就进入死循环了。既要一个节点访问多次,又要防止进入死循环。那么这里去重的不是节点,而是访问过的节点路径。
 状态1:节点0->节点1,访问了节点0和1,当前节点是1。
 状态2:节点0->节点1->节点0,也是访问了节点0和1,当前节点是0。
 上面的两种状态,虽然都只有两个节点被访问,但是当前节点不同,那么能选择的路径就可以不同。所以状态1和状态2是不同的状态,不能被放弃。
 状态3:节点0->节点1->节点0->节点1,也是访问了节点0和1,当前节点是1。描述完之后就发现状态3和状态1是一样的。而状态3的步数更多。所以状态3是属于重复状态,需要放弃。
 之后的可能的状态是:
 状态4:节点0->节点1->节点0->节点2
 状态5:节点0->节点1->节点0->节点2->节点0
 状态6:节点0->节点1->节点0->节点2->节点0->节点3
 也就是说需要5步可以遍历完所有节点。
 我们可以使用DFS或者BFS遍历边。编码的重点是解决怎么记录状态。我们需要记录当前已经访问了哪些节点,当前节点是哪个。前者使用bit数组记录。1=访问了节点0;3=访问了节点0和1;2=访问了节点1… 2N−1=2^N-1=2N1=访问了所有节点。

节点标签N-1N-23210
代表值2N−12^{N-1}2N12N−22^{N-2}2N2232^323222^222212^121202^020

public class ShortestPathVisitingAllNodesV2 {public static void main(String[] args){int[][] graph = new int[4][];graph[0] = new int[]{1,2,3};graph[1] = new int[]{0};graph[2] = new int[]{0};graph[3] = new int[]{0};int r = new ShortestPathVisitingAllNodesV2().shortestPathLengthDFS(graph);System.out.println(r);}public int shortestPathLengthBFS(int[][] graph) {int N = graph.length;Queue<State> queue = new LinkedList();int[][] dist = new int[1<<N][N];for (int[] row: dist) Arrays.fill(row, N*N);int startNode = 1;dist[1<<startNode][startNode] = 0;queue.offer(new State(1<<startNode,startNode));//BFS遍历while(!queue.isEmpty()){int size = queue.size();for(int i=0;i<size;i++){State node = queue.poll();int d = dist[node.cover][node.head];if(node.cover == (1<<N)-1) return d;for(int child : graph[node.head]){int newCover = node.cover | 1 << child;if(dist[newCover][child]>d+1){dist[newCover][child] =  d +1;queue.offer(new State(newCover,child));}}}}throw null;}private int minDis = Integer.MAX_VALUE;public int shortestPathLengthDFS(int[][] graph) {int N = graph.length;int[][] dist = new int[1<<N][N];for (int[] row: dist) Arrays.fill(row, N*N);int startNode = 0;dist[1<<startNode][startNode] = 0;dfs(new State(1<<startNode,startNode),graph,N,dist);return minDis;}private void dfs(State state,int[][] graph,int N,int[][] dist) {if(state.cover == (1<<N)-1){minDis = Math.min(minDis,dist[state.cover][state.head]);}else{for(int child : graph[state.head]){int newCover = state.cover | 1 << child;if(dist[newCover][child]>dist[state.cover][state.head]+1){dist[newCover][child] = dist[state.cover][state.head]+1;dfs(new State(newCover,child),graph,N,dist);}}}}class State {int cover, head;State(int c, int h) {cover = c;head = h;}}
}

再进一步计算从各个节点开始。修改代码

		int startNode = 1;dist[1<<startNode][startNode] = 0;queue.offer(new State(1<<startNode,startNode));

修改为:

for(int startNode=0;startNode<N;startNode++){dist[1<<startNode][startNode] = 0;queue.offer(new State(1<<startNode,startNode));}

代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三十期:程序员报告:男性占比超87% 北京月薪12184元最高

1024“程序员节”&#xff0c;58同城招聘研究院发布程序员行业大数据报告显示&#xff0c;程序员男性占比高达87.29%。 作者&#xff1a;朝晖 1024“程序员节”&#xff0c;58同城招聘研究院发布程序员行业大数据报告显示&#xff0c;程序员男性占比高达87.29%&#xff0c;北…

[Leetcode][LCP 19][JAVA][秋叶收藏集][动态规划]

【问题描述】[中等] 【解答思路】 1. 动态规划 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {public int minimumOperations(String leaves) {if (leaves null || leaves "") { // 排除 不合法参数情况return 0;}int length leave…

Qt 读写XML文件

#ifndef SIM_XMLSTREAMREADER_H_ #define SIM_XMLSTREAMREADER_H_#include <QString> #include <QXmlStreamReader>class XmlStreamReader { public:XmlStreamReader();~XmlStreamReader();//读取文件bool ReadFile(const QString &fileName);//跳过不能识别的…

第三十一期:QQ for Linux 复活,微信 for Linux 还远吗?

网友通过分析龙芯处理器的生态支持计划与近期 QQ for Linux 支持 MIPS 架构的事实&#xff0c;结合当前国产自主研发的大背景&#xff0c;认为距离微信 for Linux 的发布也不远了。 10 月 24 日晚间&#xff0c;腾讯突然发布了沉寂多年的 QQ for Linux 新版本&#xff0c;引起了…

[Leetcode][第141、142题][JAVA][环形链表][哈希表][快慢指针][数学推理]

【问题描述】[中等] 【解答思路】 141 每次遍历到一个节点时&#xff0c;判断该节点此前是否被访问过。 具体地&#xff0c;我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点&#xff0c;如果该节点已经存在于哈希表中&#xff0c;则说明该链表是环形链…

847. Shortest Path Visiting All Nodes(三)

DP  这道题目还可以用动态规划解决。在图论中解决最短路径问题有Dijkstra算法和bellman-ford算法。这道题目也需要用到DP。所以先学习一下这两个算法的思想和区别。  两个算法比较  Dijstra算法用来解决单源最短路径问题。具体内容看[文章] 算法解决问题适用范围解决思路松…

样式集合

box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3);转载于:https://www.cnblogs.com/xmyd/p/10943567.html

第三十二期:你们都是怎么学Python的?

自学Python一个月&#xff0c;怎么学都学不进去&#xff0c;感觉自己方法错了&#xff0c;现在连入门都不算&#xff0c;我该怎么办啊&#xff1f;这应该是每一个零基础学Python的小白都会面临的问题&#xff0c;今天我就结合自己的经历&#xff0c;和大家分享一下我是怎么学Py…

[Leetcode][第1002题][JAVA][查找常用字符][计数][HashMap]

【问题描述】[简单] 【解答思路】 计数法 1. minfreq存放最终重复字母的个数 freq存放每次遍历字符串的字母个数 2. minfreq初始化最大值&#xff0c;每遍历一个字符串后&#xff0c;比较minfreq[i]、freq[i]的大小&#xff0c;minfreq[i]更新为两者的最小值。 3. 根据minf…

815. Bus Routes

输入&#xff1a;int[][] routes routes[i]表示第i号公交车的运行线路。如果routes[i]{1,3,5}。说明公交车运行线路是1->3->5。    int S&#xff1a;表示起始站点    int T&#xff1a;表示目的站点 输出&#xff1a;从&#xff33;到&#xff34;最少需要几辆公交…

第三十三期:连接池中非常关键的两个参数,到底是干啥用的?

说来惭愧&#xff0c;从事互联网开发好些年了&#xff0c;有些概念一直没有彻底搞清楚。其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections,在网上搜了一圈&#xff0c;发现很多都讲的含含糊糊的。 作者&#xff1a;资深开发讲技术 背景 …

一个密码经过多次MD5加密能否提高安全性?Java MD5盐值加解密

什么是MD5? MD5&#xff08;Message Digest Algorithm 5&#xff0c;信息摘要算法5&#xff09;&#xff0c;是计算机广泛使用的摘要算法&#xff08;又称哈希算法&#xff09;之一。MD5是将一段信息&#xff0c;通过其不可逆的字符串变换算法&#xff0c;产生了唯一的MD5信息…

[Leetcode][第24题][JAVA][两两交还的链表中的节点][递归][三指针]

【问题描述】[中等] 【解答思路】 1. 递归 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {public ListNode swapPairs(ListNode head) {if(head null || head.next null){return head;}ListNode next head.next;head.next swapPairs(next.next…

301. Remove Invalid Parentheses

目录题目描述回溯法有效剪枝&#xff0c;速度更快回溯法改进题目描述 输入&#xff1a;一个字符串&#xff0c;包含(,)&#xff0c;还有一些其他字符。 输出&#xff1a;左右括号完全匹配的字符串。并且要尽可能少的删除字符。 规则&#xff1a;有左括号&#xff0c;有对应的右…

第三十四期:花了一个星期,我终于把RPC框架整明白了!

RPC(Remote Procedure Call)&#xff1a;远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的思想。 作者&#xff1a;李金葵 RPC(Remote Procedure Call)&#xff1a;远程过程调用&#xff0c;它是一种通过网络从远…

win7NVIDIA显卡驱动升级时卡住

可以先装上.NET framework&#xff0c;再更新就不会卡了转载于:https://www.cnblogs.com/haizine/p/10950442.html

[Leetcode][第116 117题][JAVA][填充每个节点的下一个右侧节点指针][BFS][链表前驱节点]

【问题描述】[中等] 【解答思路】 1. BFS层次遍历思想 &#xff08;通用&#xff09; 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) public Node connect(Node root) {if (root null)return root;Queue<Node> queue new LinkedList<>();queue.add(r…

Windows Server2012 R2 无法安装.NET Framework 3.5的解决方法

Windows server 2012R2&#xff0c;自带的是.NET Framework 4.5,如果想装SQL server2008或者SQL server2012就需要安装 .ENT Framework 3.5或者2.0的版本&#xff0c;建议安装 .NET3.5 版本&#xff0c;我本人亲测过&#xff0c;成功了&#xff01; 安装不成功错误分析&#x…

第三十五期:网络爬虫是啥玩意儿?有什么用呢?

在这个用数据说话的时代&#xff0c;数据是一件极其重要的事情&#xff0c;怎样才能抓取到完整以及全面的数据呢&#xff1f;这并不是一件容易的事情。 作者&#xff1a;呦呦科学馆 如果想要做好大数据的分析&#xff0c;单单依靠一己之力或者是周边的数据是远远不够的&#x…

121 Best Time to Buy and Sell Stock

输入&#xff1a;一个数组prices,prices[i]表示第i天股票的价格。 输出&#xff1a;买卖股票的最大收益。 规则&#xff1a;只允许最多买一次&#xff0c;最多卖一次股票。如果觉得价格不合适&#xff0c;可以不买卖。 分析1&#xff1a;最先想到的是暴力搜索&#xff0c;每天都…