【题目大意】:求一个有向图的任意一个拓扑排序序列。
【解题思路】:普通拓扑排序。
①求出入度为零的点加入队列
②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 }