逃生(拓扑排序)

传送门

记录一下未解决的错误代码

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;

const int N = 100010;
int tot, head[N], n, m, indegree[N];

struct Edge{
	int v, next;
}edge[N];
bool vis[N];
void add(int u, int v){
	edge[tot].v = v;
	edge[tot].next = head[u];
	head[u] = tot ++;
}
vector<int> vec; 
void topsort(){
	priority_queue<int, vector<int>, greater<int> >pq;
	for(int i = 1; i <= n; i ++)
		if(indegree[i] == 0)
			pq.push(i);
	while(pq.size()){
		int t = pq.top();
		vec.push_back(t);
		pq.pop();
		for(int i = head[t]; i != -1; i = edge[i].next){
			int to = edge[i].v;
			indegree[to] --;
			if(indegree[to] == 0)
				pq.push(to);
		}
	}
}
int main(){
	int t;
	cin >> t;
	ios::sync_with_stdio(false);
	while(t --){
		vec.clear();
		memset(vis, 0, sizeof vis);
		memset(indegree, 0, sizeof indegree);
		memset(head, -1, sizeof head);
		tot = 0;
		cin >> n >> m;
		for(int i = 1; i <= m; i ++){
			int a, b;
			cin >> a >> b;
			vis[a] = true;
			vis[b] = true;
			add(a, b);
			indegree[b] ++;
		}
		topsort();
		int size = vec.size();
		for(int i = 0; i < size; i ++)
			cout << vec[i] << ' ';
		for(int i = 1; i <= n; i ++)
			if(!vis[i])
				cout << i << ' ';
		cout << endl;
	}
	
	return 0;
}
原文地址:https://www.cnblogs.com/pureayu/p/14489097.html