1940. Ordering Tasks(拓扑排序,用set装住入度为0的点)
来源:互联网 发布:驾驶员疲劳检测软件 编辑:程序博客网 时间:2024/06/03 20:27
/*1940. Ordering Tasks(拓扑排序,用set装住入度为0的点) 给出一些数字对(i,j), i必须在j前面执行 输出一个序列,使得序列按照指定的先后顺序输出,如果有多个 结果,则按照字典序输出.用set来装入度为0的点。set的特性是 按照插入的大小进行排序。所以可以保证字典序 拿到一个入度为0的后,就在原来的记录入得的inDegree的数组相应 位置-1 */#include <iostream>#include <cstdio>#include <set>#include <vector>#include <cstring>#include <algorithm>using namespace std;vector<int> node[100001];set<int> s;int inDegree[100001];int main(){ //freopen("in.txt", "r", stdin); //freopen("out1.txt", "w", stdout); int T, n, m; int a, b, t; scanf("%d", &T); while (T --) { scanf("%d%d", &n, &m); s.clear(); memset(inDegree, 0, sizeof(inDegree)); for (int i = 1; i <= n; i ++) node[i].clear(); for (int i = 1; i <= m; i ++) { scanf("%d%d", &a, &b); node[a].push_back(b); inDegree[b] ++; } for (int i = 1; i <= n; i ++) if (inDegree[i] == 0) s.insert(i); while (!s.empty()) { t = *s.begin(); s.erase(s.begin()); printf("%d ", t); for (int i = 0; i < node[t].size(); i ++) { inDegree[node[t][i]] --; if (inDegree[node[t][i]] == 0) s.insert(node[t][i]); } } printf("\n"); } return 0;}