zoukankan      html  css  js  c++  java
  • ACM&找双亲,并查集

    题目描述:
        如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-。
    输入:
        输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题, 然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,如果A的父母亲信息不全,则用-代替,例如A-C,再然后是m行形式如FA的字符串,表示询问F和A的关系。
        当n和m为0时结束输入。
    输出:
        如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。
        具体含义和输出格式参见样例.
    样例输入:
    3 2
    ABC
    CDE
    EFG
    FA
    BE
    0 0
    样例输出:
    great-grandparent
    -

    http://ac.jobdu.com/problem.php?pid=1035
     1 #include <iostream>
     2 #define NUMSIZE 26
     3 using namespace std;
     4 
     5 int get_num(char a);
     6 void build_tree(int tree[], int n);
     7 void printf_relation(int tree[], int m);
     8 int get_generation(int tree[], int a, int b);
     9 void print(int gene,string relation);
    10 
    11 int main()
    12 {
    13     int n,m;
    14     int tree[NUMSIZE];
    15     for(int i=0; i<NUMSIZE; i++)
    16         tree[i] = -1;
    17     int t[3]={-1};
    18     char c;
    19     while(cin>>n && n>0) {
    20         cin>>m;
    21         build_tree(tree, n);
    22         printf_relation(tree, m);
    23     }
    24     return 0;
    25 }
    26 int get_num(char a) {
    27     if(a=='-')
    28         return -1;
    29     return a-'A';
    30 }
    31 void build_tree(int tree[], int n) {
    32     int t[3]={-1};
    33     char c;
    34     for(int i=0; i<n; i++) {
    35         for(int j=0; j<3; j++) {
    36             cin>>c;
    37             t[j]=get_num(c);
    38         }
    39         if(tree[t[0]] == -1)
    40             tree[t[0]] = t[0];
    41         if(t[1]!=-1)
    42             tree[t[1]] = t[0];
    43         if(t[2]!=-1)
    44             tree[t[2]] = t[0];
    45     }
    46 }
    47 void printf_relation(int tree[], int m) {
    48     int t[2] = {-1};
    49     char a,b;
    50     for(int i=0; i<m; i++) {
    51         int generation;
    52         cin>>a>>b;
    53         t[0]=get_num(a);
    54         t[1]=get_num(b);
    55         if((generation=get_generation(tree, t[0], t[1])) !=0)
    56             print(generation,"parent");
    57         else if((generation=get_generation(tree, t[1], t[0])) !=0)
    58             print(generation,"child");
    59         else
    60             cout<<"-"<<endl;
    61     }
    62 }
    63 int get_generation(int tree[], int a, int b) {
    64     int num=0;
    65     while(a!=tree[a]){
    66         if(tree[a] == b)
    67             return ++num;
    68         a=tree[a];
    69         ++num;
    70     }
    71     return 0;
    72 }
    73 void print(int gene, string relation) {
    74     switch(gene) {
    75         case 1: cout<<relation<<endl;
    76                 break;
    77         case 2: cout<<"grand"<<relation<<endl;
    78                 break;
    79         default:
    80             for(int i=0; i<gene-2; i++)
    81                 cout<<"great-";
    82             cout<<"grand"<<relation<<endl;
    83     }
    84 }
    main.cpp
    
    
    
    
    
  • 相关阅读:
    【NOIP2017】蚯蚓
    【CF407B】Long Path
    【NOIP2017】奶酪
    【NOIP2018】赛道修建(正解)
    【NOIP2018】旅行
    【SDOI2010】地精部落
    【NOIP2017】逛公园
    百度云网盘进行注销操作
    百度超级会员租借.我租给你。
    如何在dos中运行java中的jar包
  • 原文地址:https://www.cnblogs.com/wizzhangquan/p/4030094.html
Copyright © 2011-2022 走看看