微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

访问二进制矩阵中所有1的最短路径允许访问0时

如何解决访问二进制矩阵中所有1的最短路径允许访问0时

给出n行m列的矩阵 0

n=3 and m=4
1 1 0 0
0 1 0 0
0 0 0 1
soln: 5
The answer is 5 because,I will start from position(0 based indexing) 
(0,0)->(0,1)->(1,2)->(1,3)->(2,3)
n=3 and m=6
matrix is
1 1 1 1 0 0
0 0 0 1 0 0
1 1 1 1 0 1
soln: 11
The answer is 5 because,I will start from position(0 based indexing) 
(2,5)->moving horizontally left to (2,0)->moving vertically up to(0,0)->moving horizontally right to (0,3) -> moving down to (1,3) and hence with this we will be visiting all the vertices

我尝试了最小生成树之类的方法,广度优先搜索不是一个好主意。请记住,当您从点x,y开始并开始移动时,必须一直水平或垂直移动,直到您没有至少一次访问所有顶点为止。

解决方法

这个问题似乎比我初读时想的要难(双关语)。在我看来,这是最低成本的哈密顿路径-您必须以最低的总成本访问无向图的每个顶点。

建议阅读:

  1. The Minimum Flow Cost Hamiltonian Cycle Problem
  2. How to solve the Shortest Hamiltonian Path problem on Sparse Graphs?

如果能想到一个相对简单的解决方案,我会通知您。


您提供的第二个示例是

1 1 1 1 0 0
0 0 0 1 0 0
1 1 1 1 0 1

以上内容可以翻译为

enter image description here

enter image description here

根据给定的矩阵形成图:

将每个1作为图形中的一个节点进行处理,并且相邻顶点之间有一条边。

如何连接组件?

说C1和C2是两个组成部分。找到一对顶点,使得v1属于C1,v2属于C2,并且在所有可能的对中,v1和v2之间的距离最小。如何找到这样的一对?我将其保留为练习。试试看。如果无法做到,请告诉我。

压缩边缘:

通过更多的努力,您可以“压缩”图形中的边缘。 “压缩”是指所有链都可以表示为一个节点。我试图分别借助颜色来表示上图中的链状含义。压缩虽然是一个很好的优化,但却不是必需的。

如果一个顶点连接到两个以上的顶点,则不要将其包括在压缩中,例如上面显示的黄色节点。注意,由于我们上面讨论的组件连接,黄色节点连接到蓝色1。


如果您使用0<=n,m <=30约束,则可能不必一定要形成图并对其进行压缩。正如您说的那样,在校园布局编码回合中曾问过这个问题,只需尝试使用输入矩阵,提交并检查时间限制是否超过。但是,在面对面的讨论中,可能希望通过某种方式进行优化,例如压缩边缘是我可以提出的一种优化,如果图形包含链或1的数量为少于0的数量-稀疏矩阵。


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。