首页 > 代码库 > ACM&找双亲,并查集
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 2ABCCDEEFGFABE0 0
- 样例输出:
great-grandparent-
http://ac.jobdu.com/problem.php?pid=1035main.cpp1 #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 else60 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 }
ACM&找双亲,并查集
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。