AcWing 1191. 家譜樹
阿新 • • 發佈:2022-03-16
拓撲排序祼題模板
#include <bits/stdc++.h> using namespace std; const int N = 110, M = N * N; int n; int q[N]; int d[N]; int h[N], e[M], ne[M], idx; void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx++; } void topsort() { int hh = 0, tt = -1; //所有入度為0的入佇列 for (int i = 1; i <= n; i++) if (!d[i]) q[++tt] = i; while (hh <= tt) { int t = q[hh++]; for (int i = h[t]; ~i; i = ne[i]) { int j = e[i]; if (--d[j] == 0) q[++tt] = j; } } } int main() { memset(h, -1, sizeof h); cin >> n; for (int i = 1; i <= n; i++) { int son; while (cin >> son, son) { add(i, son); d[son]++; //入度++ } } //拓撲序 topsort(); //輸出任意一組拓撲序,q陣列中就記錄的拓撲序 for (int i = 0; i < n; i++) printf("%d ", q[i]); return 0; }