算法提高之家谱树
-
核心思想:拓扑排序
- 详见算法基础之有向图的拓扑排序
- 将所有入度为0的点入队
- 删去该点连接的边 边的终点入度-1 若为0了再入队
- 详见算法基础之有向图的拓扑排序
-
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 110, M = N*2; int h[N],e[M],ne[M],idx; int q[N]; int d[N]; int n; void add(int a, int b) // 添加一条边a->b { e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ; } void topsort() { int hh=0,tt=-1; 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() { cin>>n; memset(h, -1, sizeof h); for(int i=1;i<=n;i++) { int son=0; while(cin>>son,son) { add(i,son); d[son] ++; } } topsort(); for(int i=0;i<n;i++) cout<<q[i]<<" "; return 0; }