如何在bfs java中获取两个顶点之间的所有边

Posted

技术标签:

【中文标题】如何在bfs java中获取两个顶点之间的所有边【英文标题】:How to get all the edges between two vertices in bfs java 【发布时间】:2016-11-15 05:59:35 【问题描述】:

目前我在两个顶点之间只有一对一的关系。我只想处理两个顶点之间的多个关系。我该怎么做?

我当前的代码是:

 public Collection<Vertex<V, E>> bfs() 

    Queue<Graph.Vertex<V, E>> queue = new ArrayBlockingQueue<>(this.getVertices().size());
    Collection<Vertex<V, E>> queryVertices = new LinkedList<>();
    Vertex<V, E> source = this.vertices.get(0);
    Set<Vertex<V, E>> visited = new HashSet<>();

    visited.add(source);
    queue.add(source);
    queryVertices.add(source);

    while (!queue.isEmpty()) 
        Graph.Vertex<V, E> v = queue.remove();
        Graph.Vertex<V, E> w;
        while ((w = getAdjUnvisitedVertex(v, visited)) != null) 
            visited.add(w);
            queue.add(w);
            queryVertices.add(w);
        
    

    return queryVertices;


private Vertex<V, E> getAdjUnvisitedVertex(Vertex<V, E> v, Set<Vertex<V, E>> visited) 

    for (Graph.Edge<V, E> edge : v.edges) 
        if (!visited.contains(edge.getTo())) 
            return edge.getTo();
        
    
    return null;

【问题讨论】:

【参考方案1】:

在您的 Vertex 类中尝试添加对应节点的 HashMap 或 ArrayList。当您添加边时,将 ids(或顶点的一些其他识别特征)添加到 ArrayList/HashMap 中,然后您可以在每次想要查看每个顶点连接到的节点时简单地检查 ArrayList/HashMap。这也将帮助您实现一个有效的 addEdge 算法,该算法不会添加节点之间已经存在的边。还要记住,如果您正在实现一个有向图节点 A -> 节点 B != 节点 B -> 节点 A,因此请确保在您的实现中不要遗漏边。

【讨论】:

以上是关于如何在bfs java中获取两个顶点之间的所有边的主要内容,如果未能解决你的问题,请参考以下文章

算法|图的遍历-广度优先搜索(BFS)

在两个顶点之间的无向图中查找特定边

有重边与无重边的无向图的割边求法

BFS和DFS算法

如何从顶点scala gremlin获取所有传入/传出边的所有顶点

深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现