我正在建立一个关于鳕鱼问题的答案。我并不真正关心它的功劳。它只是让我觉得我的解决方案不起作用。 该问题要求N个节点的映射和将它们全部连接成一个图的N-1个成对路径。给出任何起点,至少一次通过每个节点的最短路径是什么。与TSP类似,但是N-1路径不是N路径
数据输入是表示起始节点的整数和表示成对路径的数组。
我的解决方案: 找到每个边缘节点(只有一个邻居)。创建这些节点的数组。创建一个包含每个节点的邻居的锯齿状数组(仅直接连接)。找到哪个边缘最近,没有访问过。转到那个节点。重复该过程,但使用新的访问数组。
return语句应该将每个步骤后停止的节点作为包含起始节点和结束节点的数组返回。
我可以创建边缘数组和邻居数组。我的问题是实际的困难部分。使算法找到最近的边。
我想我有一个答案,但它使用了一个while循环,并且没有像我期望的那样正确评估。你能看到我的错误吗? h是被访问的(h为命中)数组。 e是边缘阵列。 n,邻居阵列。 s,起点。 n和h都是静态的。
public static ArrayList<Integer> getDistance(ArrayList<Integer> e, int s) {
ArrayList<Integer> retArr = new ArrayList<Integer>(2);
int search = s;
h.add(search);
int dist = 0;
while (!e.contains(search)) {
int i=0;
while (h.contains(n.get(search).get(i))) {
i++;
}
h.add(n.get(search).get(i));
search = n.get(search).get(i);
dist++;
}
retArr.add(dist);
retArr.add(search);
return retArr;
}
假设邻居地图如下:
[0]:[1,2]
[1]:[0]
[2]:[0,3,6]
[3]:[2,4]
[4]:[3,5]
[5]:[4,8]
[6]:[2]
[7]:[8]
[8]:[5,7]
这意味着e是[1,6,7]
如果你从0开始,第一步是1.这是一个边缘节点。这应该结束while循环并返回[1,1]。它确实变为1,但随后继续沿着路径0-> 1-> 0-> 2-> 3-> 4-> 5-> 8-> 7。然后它将7识别为结束节点并返回。每个非线性图都会发生这种情况。如果算法通过边缘,它将继续,直到找到第二条边。