Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有k节点的Dijkstra变体?_Java_Algorithm_Graph_Path_Dijkstra - Fatal编程技术网

Java 具有k节点的Dijkstra变体?

Java 具有k节点的Dijkstra变体?,java,algorithm,graph,path,dijkstra,Java,Algorithm,Graph,Path,Dijkstra,我必须从源和目标中找到一个最小路径,其中源和目标是同一个节点,并且我希望路径中的节点数最少。 我想实现一个Dijkstra算法(在Java中),其中k个节点包含在最小路径中。(k是要覆盖的最小节点数)。 对吗?如有,有何实施建议? 提前谢谢这是个好主意。记住在开始时将源到INF的距离设置为0,以获得正确的结果 编辑 一个简单的解决方案是从u开始,转到所有相邻顶点,并使用k作为k-1,源作为相邻顶点,目标作为v重复相邻顶点。下面是C++实现这个简单的解决方案。 一个问题是,启动节点在启动时被标记

我必须从源和目标中找到一个最小路径,其中源和目标是同一个节点,并且我希望路径中的节点数最少。 我想实现一个Dijkstra算法(在Java中),其中k个节点包含在最小路径中。(k是要覆盖的最小节点数)。 对吗?如有,有何实施建议?
提前谢谢

这是个好主意。记住在开始时将源到INF的距离设置为0,以获得正确的结果

编辑

一个简单的解决方案是从u开始,转到所有相邻顶点,并使用k作为k-1,源作为相邻顶点,目标作为v重复相邻顶点。下面是C++实现这个简单的解决方案。


一个问题是,启动节点在启动时被标记。你必须取消标记是的!关于k节点的实现有什么想法吗?这至少和解决NP难的哈密顿循环问题一样困难,因为您可以通过简单地选择任何顶点作为源/目标顶点,设置k=n,然后运行算法来解决该问题。在一条路径中,任何顶点都不能出现多次。这真的是你想要的吗?如果是这样的话,Xentros的答案是解决一个不同的问题(它计算步行,允许重复的顶点和边),你就不走运了,因为正如我上面解释的,这个问题是NP难的。如果您允许重复顶点和边,那么您需要计算行走次数——因此请编辑。(或者,您可能想计算轨迹,其中可以重复顶点,但不能重复边。)顶点不能在路径中重复,因为在我访问之后,我标记了它,而允许重复边。因此,我认为如果我在算法中使用这个变量,Xentros的解决方案是有效的。你觉得怎么样?谢谢你的回复。为什么设置为INF?如何将k个节点传递给算法呢URL@Denise请随意在我的答案旁边放上箭头和接受的答案:)链接算法考虑行走,允许顶点(和边)重复。OP请求不允许重复顶点(因此边)的路径。(可能是OP对他/她想要什么感到困惑,但至少在你澄清链接算法解决的问题之前是-1。)不幸的是,如果你这样做,DP在多项式时间内就不再有效,因为你需要记录访问的顶点集作为DP状态的一部分,并且有O(2^n)个这样的集合。当然,非DP算法仍然有效,但它也是指数时间。