zoukankan      html  css  js  c++  java
  • 深度优先搜索实现拓扑排序(leetcode210课程表)

    1. 概念

    拓扑排序:对于n个节点的有向图G,一个有向边(u, v),那么对节点进行排序后,u在v的前面(如果G中有环存在,那么不能进行拓扑排序)。
    可以用dfs(栈)和bfs(队列)来实现拓扑排序。
     
    dfs具体算法:将所有的点设为三种状态:未搜索0,搜索中1,已完成2。对任意一个未搜索节点0的相邻节点进行搜索,同时把这个节点的状态设为1,1的相邻节点只能是0和2,如果状态为1的节点的相邻节点状态为1,说明有环,返回null。如果没有相邻节点,保存到栈中,把这个节点的状态设为2。

    2. 代码

    class Solution {
        // 存储有向图
        List<List<Integer>> map;
        // 用一个数组来模拟栈
        int[] result;
        int index;
        // 保存每一个节点的访问状态
        int[] visited;
        // 如果有环存在,valid=false
        boolean valid;
    
        public int[] findOrder(int numCourses, int[][] prerequisites) {
            map = new ArrayList<>();
            result = new int[numCourses];
            index = numCourses;
            visited = new int[numCourses];
            valid = true;
    
            for(int i = 0; i < numCourses; i++){
                map.add(new ArrayList<>());
            }
            for(int[] edge : prerequisites){
                //构建有向图
                map.get(edge[1]).add(edge[0]);
            }
            for(int i = 0; i < numCourses && valid; i++){
                if(visited[i] == 0){
                    dfs(i);
                }
            }
            //说明有环
            if(!valid){return new int[]{};}
            return result;
        }
        public void dfs(int u){
            visited[u] = 1;
            for(int v : map.get(u)){
                if(visited[v] == 1){
                    valid = false;
                    return;
                }else if(visited[v] == 0){
                    dfs(v);
                }
            }
            visited[u] = 2;
            //存储到栈中
            result[--index] = u;
        }
    }

      

  • 相关阅读:
    有进度条圆周率计算
    turtle库的学习笔记(python)
    Vue框架流程图(精简版)
    Linux基础流程图(精简版)
    基于python的爬虫流程图(精简版)
    crm业务流程图(精简版)
    Django流程图(精简版)
    JavaScript流程图(精简版)
    css流程图
    select和epoll
  • 原文地址:https://www.cnblogs.com/lyuwalle/p/14272423.html
Copyright © 2011-2022 走看看