Java 这是DFS、BFS图的正确实现吗
我正在学习搜索算法BFS和DFS。我计划实现这两个功能,但在实现之前,我需要实现我的图形结构。以下是我的想法: 连接城市的图形:每个城市由一个节点表示。 我们的图将只是一个在创建节点时添加的节点的ArrayList,每个节点都有一个它的邻居列表,以及一个父节点,它将让我们知道我们来自何处(用于路径检索)。我还没有写任何东西,我想在花时间写一些行不通的东西之前,得到一些关于我想法的反馈。这是一些伪代码。我看到的一个潜在问题是,我们将如何处理可以从多个地方(多个父节点)到达的节点。如果有人对此有任何建议,欢迎分享Java 这是DFS、BFS图的正确实现吗,java,breadth-first-search,depth-first-search,Java,Breadth First Search,Depth First Search,我正在学习搜索算法BFS和DFS。我计划实现这两个功能,但在实现之前,我需要实现我的图形结构。以下是我的想法: 连接城市的图形:每个城市由一个节点表示。 我们的图将只是一个在创建节点时添加的节点的ArrayList,每个节点都有一个它的邻居列表,以及一个父节点,它将让我们知道我们来自何处(用于路径检索)。我还没有写任何东西,我想在花时间写一些行不通的东西之前,得到一些关于我想法的反馈。这是一些伪代码。我看到的一个潜在问题是,我们将如何处理可以从多个地方(多个父节点)到达的节点。如果有人对此有任何
public class Node{
String name;
Node parent;
ArrayList<Node> neighbors;
public addNeighbor(Node n);
public setParent(Node n);
public getNeighbors()
...
}
public static void main(String[] args){
ArrayList<Node> graph = new ArrayList<Node>();
//build node
Node node = new Node(String name);
//add neighbors
node.addNeighbor(neighbor1);
node.addNeighbor(neighbor2);
//set parent
node.setParent(parent1);
//add to graph
graph.add(node);
path = dfs(graph, startNode, goalNode);
System.out.print(path);
}
公共类节点{
字符串名;
节点父节点;
ArrayList邻居;
公共addNeighbor(节点n);
公共集合父节点(节点n);
公共关系
...
}
公共静态void main(字符串[]args){
ArrayList图形=新的ArrayList();
//构建节点
节点节点=新节点(字符串名称);
//添加邻居
node.addNeighbor(neighbor1);
node.addNeighbor(neighbor2);
//设置父项
node.setParent(parent1);
//添加到图形
添加(节点);
路径=dfs(图形、起始节点、目标节点);
系统输出打印(路径);
}
编辑:我知道我可以在网上很容易地找到这方面的实现,但我更愿意提出自己的解决方案。您的实现看起来不错。这是一个典型的图结构的实现(一个节点有一个邻居列表)。有几点:
- 您可以使用回溯来处理到达同一节点的多条路径。如果dfs方法具有递归实现,那么如果节点已有父节点,则需要避免递归调用。但是,如果新路径比旧路径更好,则放弃旧的父路径,并设置新路径
- 您的实现是一个方向图。换句话说,你可以构建一个从a到B有路径的图,但是没有从B到a的路径。我不知道这是否适合你
- 我建议您将图形的构建封装在包装器中,通过对方法的唯一调用自动构建两条路径。这样,您总是可以构建双向路径
- 您可以使用集合来存储邻居。这样,就不会有重复。当然,您需要在Node类中实现“equals”方法