210. 课程表II(拓扑排序)

题目:总共有n门课需要选,一些课程存在先修课程,比如要想学习课程0,需要先修课程1。返回为了学完所有课程所安排的学习顺序,如果有多种正确的顺序,返回一种即可;否则返回空数组。
解析:拓扑排序的典型应用。

1. DFS

逆向思维,最先被放入栈中的节点是拓扑排序中最后面的节点。

#include 
#include 
#include 
using namespace std;

vector> edges;  //存储有向图
vector visited;  //标记每个节点的状态:0=未搜索, 1=搜索中, 2=已完成
vector result;  //用数组模拟栈, 0为栈底, n-1为栈顶
bool valid = true;  //判断有向图中是否有环

void dfs(int u){
    visited[u]=1;  //搜索中
    for(int v: edges[u]){
        if(visited[v] == 0){
            dfs(v);
            if(!valid) return;
        }else if(visited[v] == 1){  //搜索中 说明找到了环
            valid = false;
            return;
        }
    }
    visited[u]=2;  //已完成
    result.push_back(u);  //将该节点入栈
}

vector findOrder(int numCourses, vector>& prerequisites){
    edges.resize(numCourses);
    visited.resize(numCourses);
    for(int i=0; i的节点,开始进行深度优先搜索
    for(int i=0; i

2. BFS

正向思维,按照入度为0的节点顺序生成拓扑排序。

#include 
#include 
#include 
#include 
using namespace std;

vector> edges;  //存储有向图
vector indeg;  //存储每个节点的入度 
vector result; 

vector findOrder(int numCourses, vector>& prerequisites){
    edges.resize(numCourses);
    indeg.resize(numCourses);
    for(int i=0; i q;
    //将所有入度为0的节点放入队列
    for(int i=0; i

你可能感兴趣的:(210. 课程表II(拓扑排序))