HZOJ-641:拓扑排序

#include
#include
#include

using namespace std;

//7 6
//1 2
//1 4
//2 3
//4 5
//3 6
//5 6

//HZOJ-641:拓扑排序
int main() {
	int n, m;
	cin >> n >> m;

	//两个数组,一个存储节点入度,一个存储答案
	vector indeg(n + 1), ans;

	//二维数组存储指向
	vector> v(n + 1);
	for (int i = 0, a, b; i < m; i++) {
		cin >> a >> b;
		indeg[b]++;
		v[a].push_back(b);
	}

	//维护一个堆,存储入度为零的元素
	set s;
	for (int i = 1; i <= n; i++) {
		if (!indeg[i]) s.insert(i);
	}
	while (!s.empty()) {
		int a = *s.begin();
		s.erase(s.begin());
		ans.push_back(a);

	    //结点出堆后,指向的所有结点的入度减一
		for (auto x : v[a]) {

			//如果减一后入度为零,则压入到堆中,准备出堆
			if (--indeg[x] == 0) {
				s.insert(x);
			}
		}
	}
	int flag = 0;
	for (auto x : ans) {
		if (flag) cout << " ";
		cout << x;
		flag = 1;
	}
	return 0;
}

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