在许多在线资源和教科书中,他们说图表表示为:
每个节点都存储其邻居列表:
class Graph { ArrayList allNodes;
class Node{
Integer id;
ArrayList<Node> neighbors;
Boolean visited;
}
或者邻接列表为:
class Graph{
HashMap<Node,ArrayList<Node>> adjMap;
}
class Node{
Integer id;
Boolean visited;
}
这些不同的在线消息来源声称我们可以添加一个布尔标志来跟踪被访问的节点。我认为由于指针这对C ++是可以的,但它在Java中不起作用。我的问题是在实现BFS,DFS,拓扑排序和使用修改后的DFS检测循环时我发现Java中的上述方法不起作用。如果你想跟踪访问节点,你可以添加一个布尔标志“访问过”&#39;到类Node。但是这个标志在整个图表中是不一致的。为了解释一个例子,让我们说我们有一个图表,从上面表示为(1),我们可能有:
<Node> => ArrayList<nighbors>
1 => 2 , 3, 5
2 => 4
3 => 4, 5
从文件中填充此图时,我发现Java认为节点2指向的节点4与节点3指向的节点4不同。这尽管覆盖了equals()和hashCode()方法。 类似地,如果图形表示为上面的(2),则在访问节点时再次遇到节点4时,不会记住在其邻居的ArrayList中多次使用节点4并且在访问节点2时修改节点4的访问标志的adjMap。 3。
我找到的解决方案是图表,如下所示:
class Graph{
public class Graph {
// Graph is shown as Node -> List of neighbouring nodes
HashMap<Node, ArrayList<Node>> adjMap = new HashMap<Node, ArrayList<Node>>();
HashMap<Node, Boolean> isExploredMap = new HashMap<Node, Boolean>();
Set<Node> allNodes = new HashSet<Node> ();
}
class Node{
Integer id;
}
那就是我们保留另一个名为isExploredMap的HashMap,它存储该节点是否被访问过。我担心的是它需要更多的O(N)空间,这与前面两个不适用于我的推荐解决方案不同。有人可以解释如何获得前两个解决方案来克服不一致的标志条件? 或者,如果不可能,我需要确认我的解决方案是可以接受的方式来做这些事情。
这假设输入是从每行作为边的文件中读取的,例如: 1 2 2 3 1 4
表示节点1连接到节点2和节点4,节点2连接到节点3