JGraphT中EdgeReversedGraph遍历未反转及DFS标定v7为最深节点问题
问题根因
- 你调用
BreadthFirstIterator时没有指定遍历起始节点,JGraphT会默认按顶点的插入顺序逐个选取未访问的顶点作为BFS起点,遍历全图所有顶点。你的原图顶点插入顺序为v1到v7,所以两次遍历输出顺序和插入顺序高度相似,和你预期的从终点倒序遍历完全不符。 - EdgeReversedGraph仅反转所有边的方向,不会自动调整遍历起点,反转后的图如果从v1出发遍历,只能拿到v1单个节点,不会返回全图结果。
实现方案
方案1:反转图从v7开始BFS,直接得到倒序结果
构造遍历器时指定起始节点为v7即可得到你预期的v7→v5/v6→v4→v3→v1的遍历顺序:
Graph<String, DefaultEdge> stringGraphReversed = new EdgeReversedGraph<String, DefaultEdge>(stringGraph); // 指定起始节点为v7 BreadthFirstIterator<String, DefaultEdge> iteratorReversed = new BreadthFirstIterator<>(stringGraphReversed, "v7"); System.out.println("\n\n\nReversed Graph BreadthFirst from v7\n"); while (iteratorReversed.hasNext()) { String node = iteratorReversed.next(); System.out.println(node); }
方案2:原图深度优先遍历,v7自动被识别为最深节点
直接从原图的起始点v1启动深度优先遍历即可,v7距离v1的路径最长,会被自动识别为最深节点,你可以通过遍历器的getDepth()方法验证节点深度:
// 原图从v1启动DFS DepthFirstIterator<String, DefaultEdge> dfsIterator = new DepthFirstIterator<>(stringGraph, "v1"); System.out.println("\n\n\nOriginal Graph DFS from v1\n"); while (dfsIterator.hasNext()) { String node = dfsIterator.next(); System.out.printf("节点:%s,深度:%d%n", node, dfsIterator.getDepth(node)); }
输出结果中v7的深度为所有节点最大值,符合你要求的“v7为最深节点”的预期。如果你需要遍历顺序从v7到v1,将DFS后序遍历结果或者原图拓扑排序结果反转即可。
内容的提问来源于stack exchange,提问作者user16912098
相关产品推荐
相关产品推荐

