标签:九度
这道题目一开始我还以为是并查集,后来发现比并查集简单的多,就是一个家谱树,然后找到两个节点之间的深度差。
#include<stdio.h> int data[30]; void make_set(){ for(int i=0;i<30;i++) data[i]=-1; } int find(int a,int b){ int re=1; while(data[a]!=-1){ if(data[a]==b)return re; a=data[a]; re++; } return -1; } int main(){ int n,m; char a[4]; while(scanf("%d %d",&n,&m)){ if(m==0&&n==0) break; make_set(); for(int i=0;i<n;i++){ scanf("%s",a); data[a[1]-'A']=data[a[2]-'A']=a[0]-'A'; } for(int i=0;i<m;i++){ scanf("%s",a); int x=find(a[0]-'A',a[1]-'A'); int y=find(a[1]-'A',a[0]-'A'); int re = x>y?x:y; if(re<=0){ printf("-\n"); } else{ if(x>0){ if(re==1) printf("parent\n"); else{ for(int i=2;i<re;i++){ printf("great-"); } printf("grandparent\n"); } } else if(y>0){ if(re==1) printf("child\n"); else{ for(int i=2;i<re;i++){ printf("great-"); } printf("grandchild\n"); } } } } } return 0; }
标签:九度
原文地址:http://blog.csdn.net/u010006643/article/details/46546299