1. 程式人生 > >資料結構與演算法題目集7-34——任務排程的合理性

資料結構與演算法題目集7-34——任務排程的合理性

我的資料結構與演算法題目集程式碼倉: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++解題報告: