資料結構與演算法題目集7-34——任務排程的合理性
阿新 • • 發佈:2018-12-08
我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set
原題連結:https://pintia.cn/problem-sets/15/problems/861
題目描述:
知識點:拓撲排序
思路:拓撲排序拓撲排序的演算法步驟如下:
(1)定義一個佇列Q,並把所有入度為0的節點加入佇列。
(2)取隊首節點,輸出。然後刪去所有從它出發的邊,並令這些邊到達的頂點的入度減1,如果某個頂點的入度減為0,則將其加入佇列。
(3)反覆進行(2)操作,直到佇列為空。如果佇列為空時入過隊的節點數恰好為N,說明拓撲排序成功,圖G為有向無環圖;否則,拓撲排序失敗,圖G中有環。
時間複雜度和空間複雜度均是O(N)。
C++程式碼:
#include<iostream> #include<vector> #include<queue> using namespace std; int N; int inDegree[101]; vector<int> graph[101]; int main(){ std::ios::sync_with_stdio(false); cin >> N; for(int i = 1; i <= N; i++){ int K; cin >> K; for(int j = 0; j < K; j++){ int num; cin >> num; graph[i].push_back(num); inDegree[num]++; } } queue<int> q; for(int i = 1; i <= N; i++){ if(inDegree[i] == 0){ q.push(i); } } int count = 0; while(!q.empty()){ int u = q.front(); q.pop(); for(int i = 0; i < graph[u].size(); i++){ int v = graph[u][i]; inDegree[v]--; if(inDegree[v] == 0){ q.push(v); } } count++; } if(count == N){ cout << 1 << endl; }else{ cout << 0 << endl; } return 0; }
C++解題報告: