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;}

原创粉丝点击