1351:【例4-12】家譜樹
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 2201 通過數: 1594
【題目描述】
有個人的家族很大,輩分關係很混亂,請你幫整理一下這種關係。
給出每個人的孩子的信息。
輸出一個序列,使得每個人的後輩都比那個人後列出。
【輸入】
第1行一個整數N(1≤N≤100),表示家族的人數;
接下來N行,第I行描述第I個人的兒子;
每行最後是0表示描述完畢。
【輸出】
輸出一個序列,使得每個人的後輩都比那個人後列出;
如果有多解輸出任意一解。
【輸入樣例】
5
0
4 5 1 0
1 0
5 3 0
3 0
【輸出樣例】
2 4 5 3 1
思路:使用拓撲排序算法
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
vector<int> p[1005];
int indege[1500];
int n;
int vis[1500];
queue<int>q;
void topsort(){
for(int i = 1; i <= n; i++){
if(!indege[i]) q.push(i);
}
while(!q.empty()){
int u = q.front();
q.pop();
cout << u << " ";
for(int i = 0; i < p[u].size();i++)
{
if(--indege[p[u][i]] == 0)
q.push(p[u][i]);
}
}
}
int main(){
ios::sync_with_stdio(false);
memset(indege,0,sizeof(indege));
memset(vis,0,sizeof(vis));
cin >> n;
for(int i = 1; i <= n; i++)
{
int x;
while(cin >> x, x != 0 )
{
p[i].push_back(x);
indege[x]++;
}
}
topsort();
return 0;
}