#include<bits/stdc++.h>
using namespace std;
queue <int> q;
const int N = 105;
int a[N][N], d[N];
int main()
{
int n, x;
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j<=n; j++)
{
cin >> x;
if (x == 0)break;
a[i][x] = 1;
d[x]++;
}
int count = 0;
for (int i = 1; i <= n; i++) {
if (d[i] == 0)
q.push(i);
}
while (!q.empty()) {
int node = q.front();
cout << node<<" ";
count++;
q.pop();
for (int i = 1; i <= n; i++) {
if (a[node][i] > 0) {
d[i]--;
if (d[i] == 0) {
q.push(i);
}
}
}
}
cout << endl << count<<endl;
if (count != n)cout << "wrong";
return 0;
}
/*
5
0
4 5 1 0
1 0
5 3 0
3 0
*/
这是一道很经典的模板题。
题目描述
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。
输入格式
第 1 行一个整数 N(1≤N≤100),表示家族的人数。接下来 N 行,第 i 行描述第 i 个人的后代编号 ai,j,表示 ai,j 是 i 的后代。每行最后是 0 表示描述完毕。
输出格式
输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。
输入输出样例
输入
5 0 4 5 1 0 1 0 5 3 0 3 0
输出
2 4 5 3 1