1. 程式人生 > >從LeetCode 210. Course Schedule II 瞭解拓撲排序

從LeetCode 210. Course Schedule II 瞭解拓撲排序

問題簡述

給定n節課,每節課按0~n-1編號。
在修某些課的時候需要有其它課的基礎,必須先上先修課。現在用pair的形式來表示要先修的課,比如 [ [0,1], [1,2] ] 就表示在修課程1之前必須先修課程0,修課程2之前必須修課程1。現在需要給出一個修課的順序,使得按照該順序修課可以順利得到所有學分。
現在的輸入為課程數和先修的順序,輸出為修課順序中的一種。
比如:

例子1
輸入:
2, [[1,0]]
表示共有兩門課,在修課程1之前必須修課程0
輸出:
[0, 1]
表示修課順序為0->1

又比如:

例子2
輸入:
4, [[1,0],[2,0],[3,1],[3,2]]
輸出:
[0
,1,2,3] 或者 [0,2,1,3](其中一個即可)

再比如:

例子3
輸入:
2, [[1,0], [0,1]]
輸出:
[]
因為無法滿足修課程1之前修課程0,同時修課程0之前修課程1,所以返回空

解決思路

其實這個問題就是讓我們在給定的輸入下,判斷能否完成拓撲排序。何為拓撲排序(詳見這裡)?
比如,在輸入為

4, [[1,0],[2,0],[3,1],[3,2]]

的情況下,得到的下圖1就是一個拓撲排序,也就是一個沒有環的有向圖。

拓撲排序

圖1 拓撲排序示意圖

比如改變一下輸入
4, [[1,0],[2,0],[3,1],[3,2],[0,3]]

得到了一個有環圖,那麼這就不是一個排序了

非拓撲排序

圖2 非拓撲排序示意圖

很簡單吧~接下來只判斷給定的輸入能否構成拓撲排序,可以的話輸出拓撲序列,不可以的話輸出空即可。
那麼,如何判斷呢?這就可以根據入度(indegree)來判斷了。所謂入度,就是構成有向圖之後,指向各個節點的邊數。
具體步驟是,我們每次去掉入度為0的點,將該點加入拓撲排序,同時刪去與其連線的邊(其它節點的入度會受到影響),直到去掉所有的點為止,如果中途遇到不存在入度為0的點的情況,那麼,就認為這個有向圖不是拓撲排序的。
比如圖1可以如下操作
拓撲排序狀態

圖3 拓撲排序狀態圖

而圖2中則直接找不到入度為0的點,認為是非拓撲排序。

原始碼

下面是一個基於BFS的拓撲排序思路,其實也不能說是嚴格意義上的BFS,只是有點像~

struct Node{
    int indegree;
    vector<int> adjacency;
    Node(){
        indegree = 0;
        adjacency.clear();
    }
};

class Solution {
private:
    vector<int> res;

public:
    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<Node*> vec;
        for (int i = 0; i < numCourses; i++){
            vec.push_back(new Node());
        }
        for (int i = 0; i < prerequisites.size(); i++){
            vec[prerequisites[i].first]->indegree++;
            vec[prerequisites[i].second]->adjacency.push_back(prerequisites[i].first);
        }
        for (int i = 0; i < vec.size(); i++){
            int j = 0;
            for (; j < vec.size(); j++){
                if (vec[j]->indegree == 0){
                    res.push_back(j);
                    vec[j]->indegree = -1;
                    for (int item : vec[j]->adjacency){
                        vec[item]->indegree--;
                    }
                    break;
                }
            }
            if (j == vec.size()){
                res.clear();
                return res;
            }
        }
        return res;
    }
};

相關推薦

LeetCode 210. Course Schedule II 瞭解排序

問題簡述 給定n節課,每節課按0~n-1編號。 在修某些課的時候需要有其它課的基礎,必須先上先修課。現在用pair的形式來表示要先修的課,比如 [ [0,1], [1,2] ] 就表示在修課程1之前必須先修課程0,修課程2之前必須修課程1。現在需要給出一個修

LeetCode 題解之 210. Course Schedule II排序模板題 2 )

210. Course Schedule II 題目描述和難度 題目描述: 現在你總共有 n 門課需要選,記為 0 到 n-1。 在選修某些課程之前需要一些先修課程。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示他們: [

LeetCode 210. Course Schedule II(排序-求有向圖中是否存在環)

target inpu begin urn take before amp 存在 fin 和LeetCode 207. Course Schedule(拓撲排序-求有向圖中是否存在環)類似。 註意到。在for (auto p: prerequistites)中特判了

leetcode 210. Course Schedule II

cond num set tor lee ac代碼 i++ log amp 跟leetcode207大致相同,鞏固一下把,不在贅述。ac代碼 class Solution { public: vector<unordered_set<int>&g

[LeetCode] 210. Course Schedule II 課程安排II

tps logic 若是 push_back don ken solution .html gre There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses

[LeetCode] 210. Course Schedule II

Problem There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prerequisites, for example to t

LeetCode: 210. Course Schedule II

public class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { if (numCourses == 0) return null; // Co

210. Course Schedule II

如果 rom rect span sch oss size number push_back There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may h

LeetCode:207. Course Schedule II(Week 7)

207. Course Schedule II 題目 There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prerequisites, for

210. Course Schedule II - Medium

步驟 nac [] ble logs public rst compute array There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have

演算法概論week4 | 210. Course Schedule II

目錄 題目描述 主要思路 解題過程 完整程式碼 題目描述 這個問題相當於判斷有向圖中是否存在迴圈。如果存在迴圈,則不存在拓撲排序,因此不可能選取所有課程進行學習。如果沒有迴圈,則可以進行拓撲排序。 主要思路 我們可以通過DFS進行拓撲排序。回憶一下D

leetcode刷題筆記-topological sort排序(DFS)

207. Course Schedule 找環 There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prerequisites, for

Course Schedule II leetcode java 走地牙

/* 1 建立list陣列 存放 基礎課程的後續課程, 2 建立int陣列 存放 後續課程需要的基礎課程數量; 3 建立queue 用於bfs 把基礎課程放入queue 每層bfs 找出 基礎課程的後續可能 若其需要基礎課程的數量為0 則 推入queue中,並且寫入resul

[LeetCode] Course Schedule II 課程清單之二

There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prerequisites, for example to take course 0 you have to

[leetcode] Course Schedule II

和Course Schedule類似,記錄下結果即可。程式碼如下: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {

判斷有向圖是否有環之排序-LeetCode 207. Course Schedule

拓撲排序:對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u線上性序列中出現在v之前。 下圖是一個拓撲排序: 下圖不是一個拓撲排序:如何獲得

LeetCode刷題MEDIM篇Course Schedule II

題目 There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prerequisites, for examp

[leetcode-630-Course Schedule III]

read note all ready 3rd date sts imp amp There are n different online courses numbered from 1 to n. Each course has some duration(course

[LeetCode] 207. Course Schedule 課程安排

several exp bfs ade true highlight ons 結點 節點 There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may

LeetCode:207. Course Schedule(Week 6)

207. Course Schedule 題目 There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prerequisites, for ex