gpt4 book ai didi

java - 使用 DFS 和 java 寻路

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:33:19 26 4
gpt4 key购买 nike

我正在开发一种用于在图中查找路径的搜索算法。在这个算法中,我需要在一个无向的、没有加权的图中找到所有路径,这些路径只通过每个图连接一次。它必须在同一个节点中开始和结束。目前,我的程序正在做的是查找仅通过每个节点一次的所有路径。我需要连接而不是节点。

这是我的代码:

import java.util.*;

public class dfs {

private static Map<Integer, LinkedHashSet<Integer>> map = new HashMap<Integer, LinkedHashSet<Integer>>();
private int startNode;
private int numLinks;

public dfs(int startNode, int numLinks) {
super();
this.startNode = startNode;
this.numLinks = numLinks;
}

public int getNumLinks(){
return numLinks;
}

public void addEdge(int source, int destiny) {
LinkedHashSet<Integer> adjacente = map.get(source);
if(adjacente==null) {
adjacente = new LinkedHashSet<Integer>();
map.put(source, adjacente);
}
adjacente.add(destiny);
}

public void addLink(int source, int destiny) {
addEdge(source, destiny);
addEdge(destiny, source);
}

public LinkedList<Integer> adjacentNodes(int adj) {
LinkedHashSet<Integer> adjacente = map.get(adj);
System.out.println("adjacentes:" + adjacente);
if(adjacente==null) {
return new LinkedList<Integer>();
}
return new LinkedList<Integer>(adjacente);
}


public static void main(String[] args) {

Scanner input = new Scanner(System.in);

int numVertices = input.nextInt();
int numLinks = input.nextInt();
int startNode = input.nextInt();
int endNode = startNode;

dfs mapa = new dfs(startNode, numLinks);

for(int i = 0; i<numLinks; i++){
int inicio = input.nextInt();
int fim = input.nextInt();
mapa.addLink(inicio, fim);

}

List<ArrayList<Integer>> paths = new ArrayList<ArrayList<Integer>>();
List<Integer> visited = new ArrayList<Integer>();
visited.add(startNode);
Integer currentNode = 0;

Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
currentNode = (Integer) pairs.getKey();

mapa.findAllPaths(mapa, visited, paths, currentNode);

}
}

private void findAllPaths(dfs mapa, List<Integer> visited,
List<ArrayList<Integer>> paths, Integer currentNode) {

if (currentNode.equals(startNode)) {
paths.add(new ArrayList<Integer>(visited));

LinkedList<Integer> nodes = mapa.adjacentNodes(currentNode);

for (Integer node : nodes) {

List<Integer> temp = new ArrayList<Integer>();
temp.addAll(visited);
temp.add(node);
System.out.println("temp:" + temp);

findAllPaths(mapa, temp, paths, node);
}
}
else {
LinkedList<Integer> nodes = mapa.adjacentNodes(currentNode);
System.out.println("currentNode:" + currentNode);

List<Integer> inseridos = new ArrayList<Integer>();

for (Integer node : nodes) {
if (visited.contains(node)) {
continue;
}
List<Integer> temp = new ArrayList<Integer>();
inseridos.add(currentNode);
temp.addAll(visited);
System.out.println("visited:" + visited);

temp.add(node);

findAllPaths(mapa, temp, paths, node);
}
}
}
}

程序在他的输入中接收整数。第一个是节点数,第二个是链接数,第三个是起始节点和结束注释,它们是相同的。后面的所有整数代表节点之间的连接。

举个例子:程序收到“1 2 3 3 4 5 6” 1是节点数,2是链接数,3是起始节点,3 4是节点3到节点4的连接5 6 是节点 5 到 6 的连接。

现在,我认为以下代码:

if (visited.contains(node)) {
continue;
}

使程序不会多次通过每个节点。我需要帮助将我的程序转换为仅通过每个连接一次,而不是通过每个节点一次。

关于我如何做到这一点有什么想法吗?

最佳答案

我假设您指的是 Edge 而不是 Connection。这样,您想要的是找到包含所有边的所有循环(在同一节点开始和结束的路径)。

通过每条边一次的循环称为欧拉路径。可以看一个解决办法here .

关于java - 使用 DFS 和 java 寻路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9812675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com