#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 210;
int n; // 定义整数n,表示家族的人数
vector<int> g[N]; // 定义一个大小为N的向量数组g,用于存储每个人的孩子信息
int deg[N], a[N], cnt; // 定义三个整数数组deg、a和cnt,分别用于存储每个人的孩子的个数、输出序列和计数器
void topsort() {
queue<int> q;
for (int i = 1; i <= n; i++) // 遍历每个人
if (!deg[i]) q.push(i); // 如果该人没有孩子,将其加入队列
while (q.size()) { // 当队列不为空时
int x = q.front(); q.pop(); // 取出队首元素x,并将其出队
a[++cnt] = x; // 将x加入输出序列
for (int i = 0; i < g[x].size(); i++) { // 遍历x的孩子
int y = g[x][i]; // 取出x的第i个孩子y
if (--deg[y] == 0) q.push(y); // 如果y没有孩子了,将其加入队列
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) { // 遍历每个人
int son;
while (cin >> son, son) // 输入该人的孩子的编号,直到输入0
g[i].push_back(son); // 将该人的孩子的编号加入向量数组g中
}
for (int i = 1; i <= n; i++) { // 遍历每个人
for (int j = 0; j < g[i].size(); j++) { // 遍历该人的孩子的编号
deg[g[i][j]]++; // 将该孩子的编号在deg数组中的值加1,表示该孩子的父母数加1
}
}
topsort(); // 调用拓扑排序函数
for (int i = 1; i <= cnt; i++) cout << a[i] << ' ';
return 0;
}
1191. 家谱树 拓扑排序
最新推荐文章于 2024-07-25 11:27:31 发布