[AcWing 848] 有向圖的拓撲序列
阿新 • • 發佈:2022-05-06
點選檢視程式碼
#include<iostream> #include<cstring> #include<queue> using namespace std; const int N = 1e5 + 10; int n, m; int h[N], e[N], ne[N], idx; int d[N]; queue<int> q, r; void add(int a, int b) { e[idx] = b; ne[idx] = h[a]; h[a] = idx ++; } bool topsort() { for (int i = 1; i <= n; i ++) { if (!d[i]) q.push(i); } while (q.size()) { int t = q.front(); r.push(t); q.pop(); for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (-- d[j] == 0) q.push(j); } } return r.size() == n; } int main() { cin >> n >> m; memset(h, -1, sizeof(h)); while (m --) { int a, b; cin >> a >> b; add(a, b); d[b] ++; } if (topsort()) { while (r.size()) { cout << r.front() << ' '; r.pop(); } } else puts("-1"); return 0; }
- 有向無環圖一定存在入度為 0 的節點;
- 在用鄰接表建立邊的關係時,用 d 記錄邊 b 的入度;
- topsort 用來判斷是否有拓撲序列,每次把入度為 0 的點放到佇列中,隊頭出隊時,用佇列 r 來記錄拓撲序列,把隊頭指向節點的入度減一,如果有節點入度變為 0,就把節點入隊,最後,如果佇列 r 中的元素個數等於 n,說明是有向無環圖;