Java语言怎么进行一次扫描实现对于有向图是否存在环进行判断,编写成函数

Java语言怎么进行一次扫描实现对于有向图是否存在环进行判断,编写成函数,能不能不用递归?不要递归的写法是什么

如图

img


代码如下:

import java.util.*;

public class DirectedGraph {

    private int V;
    private List<List<Integer>> adjList;

    public DirectedGraph(int vertices) {
        V = vertices;
        adjList = new ArrayList<>(V);
        for (int i = 0; i < V; i++) {
            adjList.add(new ArrayList<>());
        }
    }

    public void addEdge(int src, int dest) {
        adjList.get(src).add(dest);
    }

    public boolean isCyclic() {
        boolean[] visited = new boolean[V];
        boolean[] stack = new boolean[V];

        Stack<Integer> stackDFS = new Stack<>();
        for (int i = 0; i < V; i++) {
            if (isCyclicUtil(i, visited, stack, stackDFS)) {
                return true;
            }
        }
        return false;
    }

    private boolean isCyclicUtil(int vertex, boolean[] visited, boolean[] stack, Stack<Integer> stackDFS) {
        visited[vertex] = true;
        stack[vertex] = true;
        stackDFS.push(vertex);

        List<Integer> neighbors = adjList.get(vertex);
        for (int neighbor : neighbors) {
            if (!visited[neighbor]) {
                if (isCyclicUtil(neighbor, visited, stack, stackDFS)) {
                    return true;
                }
            } else if (stack[neighbor]) {
                // 如果某个邻居已经被访问过且存在于递归栈中,则表示存在环
                return true;
            }
        }

        // 将当前节点出栈,并将对应的标记置为false
        stack[vertex] = false;
        stackDFS.pop();
        return false;
    }

    public static void main(String[] args) {
        DirectedGraph graph = new DirectedGraph(4);
        graph.addEdge(0, 1);
        graph.addEdge(1, 2);
        graph.addEdge(2, 0);
        graph.addEdge(2, 3);

        if (graph.isCyclic()) {
            System.out.println("图中包含一个循环");
        } else {
            System.out.println("图中不包含一个循环");
        }
    }
}


思路 : 使用深度优先搜索(DFS)算法来判断有向图是否存在环

你看看这个:https://blog.csdn.net/weixin_68320784/article/details/123989512

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^