我正在寻找一种算法,它对我来说似乎非常典型,但似乎常见的解决方案都不太一样。
在一个无向图中,我想要访问每个节点的最短路径。节点可以重复访问,而且我不必返回起点。
旅行商问题似乎增加了每个节点只能被访问一次并且路径必须返回到起点的限制。
最小生成树可能是解决方案的一部分,但这种算法只提供了树形结构,而不是最小路径。此外,由于它们是树形结构且没有环路,所以强制回溯,在某些情况下可能更有效的是使用环路。
我正在寻找一种算法,它对我来说似乎非常典型,但似乎常见的解决方案都不太一样。
在一个无向图中,我想要访问每个节点的最短路径。节点可以重复访问,而且我不必返回起点。
旅行商问题似乎增加了每个节点只能被访问一次并且路径必须返回到起点的限制。
最小生成树可能是解决方案的一部分,但这种算法只提供了树形结构,而不是最小路径。此外,由于它们是树形结构且没有环路,所以强制回溯,在某些情况下可能更有效的是使用环路。
public int shortestPathInSmallGraph(int[][] graph) {
if (graph.length == 1) {
return 0;
}
Set<Integer>[] adj = new HashSet[graph.length];
int n = graph.length;
int endState = (1 << n) - 1;
boolean[][] seen = new boolean[n][endState];
Queue<int[]> queue = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
queue.add(new int[] {i, 1 << i});
seen[i][1 << i] = true;
}
int steps = 0;
while (!queue.isEmpty()) {
int count = queue.size();
for (int i = 0; i < count; i++) {
int[] pair = queue.poll();
int node = pair[0];
int state = pair[1];
for (int neighbor : graph[node]) {
int nextState = state | (1 << neighbor);
if (nextState == endState) {
return 1 + steps;
}
if (!seen[neighbor][nextState]) {
seen[neighbor][nextState] = true;
queue.add(new int[] {neighbor, nextState});
}
}
}
steps++;
}
return -1;
}