Leetcode 207.课程表
課程表
現在你總共有 n 門課需要選,記為?0?到?n-1。
在選修某些課程之前需要一些先修課程。?例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示他們: [0,1]
給定課程總量以及它們的先決條件,判斷是否可能完成所有課程的學習?
示例 1:
輸入: 2, [[1,0]]
輸出: true
解釋:?總共有 2 門課程。學習課程 1 之前,你需要完成課程 0。所以這是可能的。
示例 2:
輸入: 2, [[1,0],[0,1]]
輸出: false
解釋:?總共有 2 門課程。學習課程 1 之前,你需要先完成?課程 0;并且學習課程 0 之前,你還應先完成課程 1。這是不可能的。
說明:
- 輸入的先決條件是由邊緣列表表示的圖形,而不是鄰接矩陣。詳情請參見圖的表示法。
- 你可以假定輸入的先決條件中沒有重復的邊。
?
拓撲排序
對一個有向無環圖G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點 u 和 v,若存在由 u 到 v的路徑,則在拓撲排序序列中一定是 u 出現在 v 的前邊。
?
在一個有向圖中找到一個拓撲排序序列的過程如下:
?
從有向圖中選擇一個沒有前驅(入度為0)的頂點輸出。
刪除1. 中的頂點,并且刪除從該頂點出發的全部邊。
重復上述兩步,直到剩余的網中不存在沒有前驅的頂點為止。
?
可以利用寬度優先遍歷的思想完成。
設置一個count 記錄輸出的頂點個數,用一個隊列記得當前入度為0的結點。
從入度為 0 的結點入隊。然后隊列不空的時候循環執行,出隊,將出隊頂點輸出,count++,將由此頂點引出的邊所指向的頂點的入度都減1,并且將入度變成0的頂點入隊,隊列為空退出,排序結束。判斷n是否等于圖中頂點個數,如果等于,排序成功。
圖的存儲結構:
1、鄰接矩陣表示法:
如果 第 1個點和第 3個點 相連則 matrix[0][2]=1;如果兩節點之間有一條弧,則鄰接矩陣中對應的元素為1;否則為0。可以看出,這種表示法非常簡單、直接。但是,在鄰接矩陣的所有n*n 個元素中,只有 m個為非零元。如果網絡比較稀疏,這種表示法浪費大量的存儲空間,從而增加了在網絡中查找弧的時間。
這里寫圖片描述
2、鄰接表表示法:
鄰接表表示法將圖以鄰接表(adjacency lists)的形式存儲在計算機中。所謂圖的鄰接表,也就是圖的所有節點的鄰接表的集合;而對每個節點,它的鄰接表就是它的所有出弧。鄰接表表示法就是對圖的每個節點,用一個單向鏈表列出從該節點出發的所有弧,鏈表中每個單元對應于一條出弧。為了記錄弧上的權,鏈表中每個單元除列出弧的另一個端點外,還可以包含弧上的權等作為數據域。圖的整個鄰接表可以用一個指針數組表示。
這里寫圖片描述
?
1 class Solution { 2 public boolean canFinish(int numCourses, int[][] prerequisites) { 3 int[][] matrix = new int[numCourses][numCourses]; // i -> j //鄰接矩陣存儲圖 4 int[] indegree = new int[numCourses]; // 統計每個節點的入度 5 for (int i = 0; i < prerequisites.length; i++) { 6 int ready = prerequisites[i][0]; 7 int pre = prerequisites[i][1]; 8 if (matrix[pre][ready] == 0) 9 indegree[ready]++; matrix[pre][ready] = 1; 10 } 11 int count = 0; 12 Queue<Integer> queue = new LinkedList(); 13 for (int i = 0; i < indegree.length; i++) { 14 if (indegree[i] == 0) queue.offer(i); 15 } 16 while (!queue.isEmpty()) { 17 int course = queue.poll(); 18 count++; 19 for (int i = 0; i < numCourses; i++) { 20 if (matrix[course][i] != 0) {// 節點 i 與該節點相連 21 indegree[i]--; 22 // 與剛出隊的節點相連的節點,入度減一 23 if (indegree[i] == 0) { 24 // 如果為0,說明沒有前驅,可以訪問 25 queue.offer(i); 26 } 27 } 28 } 29 } 30 return count == numCourses; // 如果所有節點是否都訪問了,如果是說明成功 31 } 32 }
?
?
?
轉載于:https://www.cnblogs.com/kexinxin/p/10203019.html
總結
以上是生活随笔為你收集整理的Leetcode 207.课程表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 换一个苹果ipad的屏幕多少钱
- 下一篇: 问两次试管婴儿失败