题解 | #星际航线规划#

星际航线规划

https://www.nowcoder.com/practice/3507890f91584e2a9b1802c1871d311e

GPT: 我们使用邻接表来表示图。然后,我们使用深度优先搜索来检测是否存在环。在搜索过程中,我们使用两个布尔数组来跟踪访问过的节点和当前路径上的节点。如果我们在搜索过程中遇到一个已经访问过的节点,并且它在当前路径上,那么就说明存在环。如果搜索完所有的节点都没有发现环,那么就说明可以访问所有的星球。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 输入星球的数量
        int m = scanner.nextInt(); // 输入航线的数量
        List<Integer>[] graph = new List[n]; // 创建邻接表来表示图
        for (int i = 0; i < n; i++) {
            graph[i] = new ArrayList<>(); // 初始化邻接表
        }
        for (int i = 0; i < m; i++) {
            int x = scanner.nextInt() - 1; // 输入星球x
            int y = scanner.nextInt() - 1; // 输入星球y
            graph[x].add(y); // 在邻接表中添加一条从星球x到星球y的边
        }
        boolean[] visited = new boolean[n]; // 创建布尔数组来跟踪访问过的节点
        boolean[] onStack = new boolean[n]; // 创建布尔数组来跟踪当前路径上的节点
        for (int i = 0; i < n; i++) {
            if (!visited[i]) { // 如果节点i没有被访问过
                if (hasCycle(graph, visited, onStack, i)) { // 检测是否存在环
                    System.out.println("No"); // 如果存在环,输出"No"
                    return;
                }
            }
        }
        System.out.println("Yes"); // 如果不存在环,输出"Yes"
    }

    private static boolean hasCycle(List<Integer>[] graph, boolean[] visited, boolean[] onStack, int v) {
        visited[v] = true; // 标记节点v为已访问
        onStack[v] = true; // 将节点v添加到当前路径上
        for (int w : graph[v]) { // 遍历节点v的所有邻居
            if (!visited[w]) { // 如果邻居w没有被访问过
                if (hasCycle(graph, visited, onStack, w)) { // 递归检测是否存在环
                    return true; // 如果存在环,返回true
                }
            } else if (onStack[w]) { // 如果邻居w已经在当前路径上
                return true; // 说明存在环,返回true
            }
        }
        onStack[v] = false; // 将节点v从当前路径上移除
        return false; // 不存在环,返回false
    }
}

全部评论

相关推荐

群星之怒:不是哥们,你就不好奇瘫痪三十年的老植物人是啥样的吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务