家谱树(信息学奥赛一本通-T1351)
生活随笔
收集整理的這篇文章主要介紹了
家谱树(信息学奥赛一本通-T1351)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
有個人的家族很大,輩分關系很混亂,請你幫整理一下這種關系。
給出每個人的孩子的信息。
輸出一個序列,使得每個人的后輩都比那個人后列出。
【輸入】
第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<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<map> #include<stack> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 1001 #define MOD 123 #define E 1e-6 using namespace std; struct Node{int pre;int next; }g[N*N]; int head[N],vis[N],q[N],dis[N]; int cnt; void add(int x,int y) {cnt++;g[cnt].pre=y;g[cnt].next=head[x];head[x]=cnt; } void top_sort(int k) {vis[k]=1;int headd=1,tail=1;q[tail]=k;tail++;while(headd<tail){int x=q[headd];cout<<x<<" ";for(int b=head[x];b;b=g[b].next){int y=g[b].pre;dis[y]--;if(!dis[y]){vis[y]=1;q[tail]=y;tail++;}}headd++;} } int main() {int n;cin>>n;int j;for(int i=1;i<=n;i++)while(cin>>j&&j){add(i,j);dis[j]++;}for(int i=1;i<=n;i++)if(!vis[i]&&!dis[i])top_sort(i);return 0; }?
總結
以上是生活随笔為你收集整理的家谱树(信息学奥赛一本通-T1351)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三角形最佳路径问题(信息学奥赛一本通-T
- 下一篇: 分治 —— 简单分治