拓撲排序:在有向圖中,將節點進行排序,使得後面的節點不會指向前面節點。
如果最後有節點指向前面,表示圖有環,不存在拓撲排序。
拓撲演算法常用來解決優先度限制下的排程問題,如:
先統計所有節點的入度,刪除入度為0的節點,然後把這個節點指向的節點的入度減一,一直做改操作,直到所有的節點都被分離出來,如果最後存在入度不為0的節點,則表示有環。
1.計算每個節點的入度,使用陣列儲存;
2.建立乙個集合儲存滿足拓撲排序的節點;
3.建立乙個佇列,儲存入度為0的節點;
3.依次取出佇列中入度為0的節點,獲取這些節點的指向節點,將這些節點的入度-1,如果這些指向節點入度更新後為0,則將這些新節點加入佇列;
4.當隊列為空時,判斷滿足拓撲排序的節點數是否等於題目中給出的優先級數,如果相等則返回true。
當然拓撲排序可以判斷乙個圖是否有環,最後判斷滿足拓撲排序元素的個數是否等於圖中的節點數即可。
模板如下:時間複雜度為o(e+v),e為邊數,v為節點數,空間複雜度為o(v)
class solution
//2.建立乙個佇列儲存入度為0的節點
linkedlistqueue = new linkedlist<>();
for (int i = 0; i < n; i++)
}//3.建立乙個集合儲存拓撲排序的元素,然後刪除入度為0的節點
listres = new arraylist<>();
while (!queue.isempty()) }}
}//4.判斷滿足拓撲排序的元素和是否等於圖的節點數
return n == res.size();}}
1.207. 課程表
class solution
//建立乙個佇列儲存入度為0的節點
linkedlistlist = new linkedlist<>();
for (int i = 0; i < numcourses; i++)
//建立乙個集合儲存拓撲排序
listres = new arraylist<>();
while (!list.isempty()) }}
}return res.size() == numcourses;}}
2.210.課程表ii
class solution
//建立乙個佇列儲存入度為0的節點
linkedlistlist = new linkedlist<>();
for (int i = 0; i < numcourses; i++)
//建立乙個集合儲存拓撲排序
listres = new arraylist<>();
while (!list.isempty()) }}
}return res.size() == numcourses;}}
拓撲排序 演算法模板
有乙個有向圖 aov網 如下 遍歷方法 每次找入度為0的節點,找到後刪除該節點和該節點的出度邊.在新的aov網中 刪除某些節點和邊後 重複這個過程 在這個圖中遍歷為 第一步 0 第二步 1 或 2 第三步 4 第四步 3 或 6 第五步 5 第六步 7 共有4種不同拓撲序列 拓撲序列反映那些工程得先...
1174 拓撲排序 一 模板題
題目鏈結 描述由於今天上課的老師講的特別無聊,小hi和小ho偷偷地聊了起來。小ho 小hi,你這學期有選什麼課麼?小hi 挺多的,比如 1,2還有 3。本來想選yyy2的,但是好像沒有先選過yyy1,不能選yyy2。小ho 先修課 是個麻煩的東西呢。小hi 沒錯呢。好多課程都有先修課程,每次選課之前...
拓撲排序模板
include include include include include using namespace std const int maxn 30 int head maxn ip,indegree maxn int n,m,seq maxn struct note edge maxn ma...