Ordering Tasks(优先工作)拓补排序

#Ordering Tasks

  • Ordering Tasks(优先工作)拓补排序_第1张图片

##工具

  • queue
  • vector

##思路
主要是处理好每个点的入度的关系,当一个节点的前驱节点全部被处理的时候,表示该节点能被处理,每处理一个节点,他对应的后序节点的入度都减1

#include 
#include 
#include 
#include 
#include 
using namespace std;

int main() {
	int case1, point, num_edge;
	cin >> case1;
	while(case1--) {
		cin >> point >> num_edge;
		int a, b;
		vector result;
		priority_queue, greater > readyTasks;
		vector task[point+1];
		int indegree[point+1];
		memset(indegree,0,sizeof(indegree));
		for(int i = 0; i < num_edge; i++) {
			cin >> a >> b;
			indegree[b]++;
			task[a].push_back(b);
		}

		for(int i = 1; i <= point; i++) {
			if(indegree[i] == 0) {
				readyTasks.push(i);
			}
		}

		while(!readyTasks.empty()) {
			int temp = readyTasks.top();
			readyTasks.pop();
			result.push_back(temp);
			for(auto it = task[temp].begin(); it != task[temp].end(); it++) {
				indegree[*it]--;
				if(indegree[*it] == 0) {
					readyTasks.push(*it);
				}
			}
		}
		for(int i = 0; i < result.size(); i++) {
			cout << result[i] << " ";
		}
		cout << endl;
	}
	return 0;
}

更多技术博客:https://vilin.club/

你可能感兴趣的:(c++,算法,数据结构,soj)