家谱树 x

家谱树 x家谱树 问题描述 有个人的家族很大 辈分关系很混乱 请你帮整理一下这种关系 给出每个人的孩子的信息 输出一个序列 使得每个人的后辈都比那个人后列出 输入格式 第 1 行一个整数 N 1 lt N lt 100 表示家族的人数 接下来 N 行 第 I 行描述第 I 个人的儿子 每行最后是 0 表示描述完毕 输出格式

家谱树
【问题描述】
    有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
    给出每个人的孩子的信息。
    输出一个序列,使得每个人的后辈都比那个人后列出。
【输入格式】
    第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
 

 1 #include 
      
       2 #include 
       
        3 #include 
        
         4 #include 
         
          5 
         #define Maxn 101 
          6 
          7 
         using 
         namespace 
          std;  
          8 
          9 
         struct 
          zhan{  
         10 
         int 
          z[Maxn],tops;  
         11 
         void add( 
         int x) 
         // 
         进栈操作  
         12 
          {  
         13 z[++tops]= 
         x;  
         14 
          }  
         15 
         int duitou() 
         // 
         返回队头元素  
         16 
          {  
         17 
         return 
          z[tops];  
         18 
          }  
         19 
         void shan() 
         // 
         删除队头元素  
         20 
          {  
         21 tops-- 
         ;  
         22 
          }  
         23 
         bool kong() 
         // 
         检验栈是否为空  
         24 
          {  
         25 
         return tops == 
         0 ? 
         1 : 
         0 
         ;  
         26 
          }  
         27 zhan () 
         // 
         构造函数(与结构体同名,没有返回值,用于初始化)  
         28 
          {  
         29 tops= 
         0 
         ;  
         30 
          }  
         31 
         }q;  
         32 
         33 
         int 
          n,temp,qwq;  
         34 
         int 
          du[Maxn],chu[Maxn];  
         35 
         int 
          gx[Maxn][Maxn];  
         36 
         37 
         int 
          main()  
         38 
         {  
         39 
         char 
          s;  
         40 scanf( 
         " 
         %d 
         ",& 
         n);  
         41 
         for( 
         int i= 
         1;i<=n;i++ 
         )  
         42 
          {  
         43 
         while(cin>> 
         s)  
         44 
          {  
         45 
         if(s== 
         ' 
         0 
         ') 
         break 
         ;  
         46 
         else 
         47 
          {  
         48 chu[i]++; 
         // 
         表示i有chu[i]条出度  
         49 du[s- 
         ' 
         0 
         ']++; 
         // 
         s入度++  
         50 gx[i][chu[i]]=s- 
         ' 
         0 
         '; 
         // 
         说明i的第几(chu[i])条出度为s  
         51 
          }  
         52 
          }  
         53 
          }  
         54 
         for( 
         int i= 
         1;i<=n;i++ 
         )  
         55 
          {  
         56 
         if(!du[i]) q.add(i); 
         // 
         如果入度为0,进栈  
         57 
          }  
         58 
         do 
         59 
          {  
         60 temp= 
         q.duitou();  
         61 
          q.shan();  
         62 cout< 
         
           " 
          " 
          ;  
          63 
          for( 
          int j= 
          1;j<=chu[temp];j++ 
          )  
          64 
           {  
          65 du[gx[temp][j]]--; 
          // 
          与刚出栈的'temp'有边的入度--  
          66 
          if(!du[gx[temp][j]]) q.add(gx[temp][j]); 
          // 
          如果这个元素的入度为0,进栈  
          67 
           }  
          68 } 
          while(!q.kong()); 
          // 
          终止条件  
          69 
          return 
          0 
          ;  
          70 } 
          
         
        
       
     

 

转载于:https://www.cnblogs.com/zxqxwnngztxx/p/6709541.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218734.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:35
下一篇 2026年3月17日 下午11:35


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号