POJ2367-Genealogical tree-拓扑排序

【题目大意】:求一个有向图的任意一个拓扑排序序列。

【解题思路】:普通拓扑排序。
①求出入度为零的点加入队列
②queue.front() 加入答案中
③queue.pop();并将当前点的边删除(当前点在队列中证明只有出边无入边)(即指向点入度r--)
④若指向点入度为0则push()
⑤重复②-④到队列为空。
【注】 类似SPFA求最短路,开一个ifinq[]数组防止重复入队。
 1 #include "cstdio"
 2 #include "iostream"
 3 #include "vector"
 4 #include "queue"
 5 #include "cstring"
 6 using namespace std;
 7 vector<</span>int> E[105];
 8 int main()
 9 {
10     int n;
11     cin >> n;
12     queue<</span>int> q;
13     int r[105];
14     bool inq[105];
15     memset(inq, false, sizeof(inq));
16     memset(r, 0, sizeof(r));
17     for (int i = 1; i <= n ; i++)
18     {
19         int s;
20         while (scanf("%d", &s) && s)
21         {
22             E[i].push_back(s);
23             r[s] ++;
24         }
25     }
26 
27     for (int i = 1; i <= n ; i++)
28     {
29 
30         if (!r[i])
31         {
32             q.push(i);
33             inq[i] = true;
34         }
35     }
36     bool k = true;
37     while (!q.empty())
38     {
39         int now = q.front();
40         q.pop();
41         for (int i = 0; i < E[now].size(); i++)
42         {
43             r[E[now][i]]--;
44 
45             if ((r[E[now][i]] == 0) && (!inq[E[now][i]]))
46             {
47                 inq[E[now][i]] = true;
48                 q.push(E[now][i]);
49             }
50         }
51         if (k)
52         {
53             printf("%d", now);
54             k = false;
55         }
56         else printf(" %d", now);
57     }
58     puts("");
59 
60 }
 
原文地址:https://www.cnblogs.com/HITLJR/p/5964867.html