java - 如何在有向图中从特定顶点执行 BFS 或 DFS,其中某些顶点的出度为 0?

标签 java algorithm data-structures depth-first-search breadth-first-search

如果我们想从给定顶点进行 DFS/BFS,当可能存在出度为 0 的顶点时,图的 DFS 或 BFS 遍历的顺序是什么 {0..n-1}

enter image description here

下面是图的一种 BFS 实现

import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Queue;

public class BreadthFirstSearch {

    static class Graph {
        int V;
        LinkedList[] vertexList;

        Graph(int v) {
            this.V = v;
            vertexList = new LinkedList[v];

            for (int i = 0; i < v; i++) {
                vertexList[i] = new LinkedList<>();
            }
        }
    }

    private void addEdge(Graph graph, int src, int dest) {
        graph.vertexList[src].add(dest); // Directed Graph Only
    }

    private void bfs(Graph graph, int vertex) {

        if (vertex > graph.V) {
            throw new IllegalArgumentException("Value not defined");
        }
        boolean visited[] = new boolean[graph.V];

        Queue<Integer> queue = new LinkedList<>();

        queue.add(vertex);
        while (!queue.isEmpty()) {
            int a = queue.poll();
            if (!visited[a]) {
                System.out.print(a + " ");
                visited[a] = true;

            }
            for (Object o : graph.vertexList[a]) {
                int n = (int) o;
                if (!visited[n]) {
                    queue.add(n);
                }
            }
        }
    }

    private void traverseGraphList(Graph G) {
        int i = 0;
        for (LinkedList list : G.vertexList) {
            ListIterator itr = list.listIterator();
            System.out.print("src: " + i++ + " ");
            while (itr.hasNext()) {
                System.out.print(" -> " + itr.next());
            }
            System.out.println();
        }
    }

    public static void main(String args[]) {
        BreadthFirstSearch g = new BreadthFirstSearch();
        int n = 8;
        Graph graph = new Graph(n);
        g.addEdge(graph, 0, 1);
        g.addEdge(graph, 0, 2);
        g.addEdge(graph, 1, 2);
        g.addEdge(graph, 2, 0);
        g.addEdge(graph, 2, 3);
        g.addEdge(graph, 3, 3);
        g.addEdge(graph, 3, 4);
        g.addEdge(graph, 5, 4);
        g.addEdge(graph, 5, 6);
        g.addEdge(graph, 7, 6);
        System.out.println("BFS starting from node 2");
        g.bfs(graph, 2);

        System.out.println();
        g.traverseGraphList(graph);
        //2 0 3 1 4

    }
}

输出为2 0 3 1 4

最佳答案

如果你想遍历图表的所有节点,那么你应该意识到,由于有些节点无法从你选择的根节点到达,所以你将无法在使用单个 BFS/时遍历它们DFS。

遍历节点的顺序取决于 BFS/DFS 的实现。在您的情况下,这取决于您将每个节点插入邻接列表的顺序。

如果你想遍历整个图,那么你应该维护哪些节点被访问,然后对每个未访问的节点运行 BFS/DFS(例如通过使用循环)。特别是,遍历节点的出现顺序再次取决于您实际循环的项目的顺序。

关于java - 如何在有向图中从特定顶点执行 BFS 或 DFS,其中某些顶点的出度为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59631016/

相关文章:

algorithm - 冲突解决策略 : What's the difference between size ordering/data ordering/least recently used rule?

c++ - 错误: invalid conversion from '__gnu_cxx::__alloc_traits<std::allocator<char>, char>::value_type' {aka 'char' } to 'const char*' [-fpermissive]

c++ - 二叉搜索树仍然是空的?

java - 在链接特定行的 Eclipse 中编写评论

java - JUnit 运行测试命令行

c++ - 为什么用 Eigen 和 OpenCV 计算的 SVD 左奇异 vector 有不同的符号

c++ - 检查字符串是否具有唯一字符

c++ - 为什么有人会使用 set 而不是 unordered_set?

java - 驾驶员考试多项选择数组while循环提示学生答题方法

java - Spring引导maven插件: goals and phase