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

  • Post author:
  • Post category:其他


#Ordering Tasks

  • 列表内容

##工具

  • queue
  • vector

##思路

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

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <memory.h>
using namespace std;

int main() {
	int case1, point, num_edge;
	cin >> case1;
	while(case1--) {
		cin >> point >> num_edge;
		int a, b;
		vector<int> result;
		priority_queue<int, vector<int>, greater<int> > readyTasks;
		vector<int> 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/



版权声明:本文为qq_36124194原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。