标签:
3 2 ABC CDE EFG FA BE 0 0
这个题目第一眼看上去很像并查集,但是仔细分析可以发现,这个题目是利用已知条件构造森林然后对其中的关系进行查找。
题目的第一行的两个输入分别是所有的information的个数,第二个输入是所有的quest的个数。
接下来的几行是information,以ABC为例,B为A的parent,C为A的parent。根据这个关系,我们可以想到建立树的方法:利用一维的数组存储,然后数组中存放数组下标对应的子孙所在位置。那么可以想到用stl中的map容器进行处理。
把森林(树)构造完毕后,我们对所有的quest进行查询。很自然就是顺着child这个内容进行查找。下面函数的find就是实现这个功能。
PS:有一种很简单的检测程序对错的测试办法,记着二叉树了没?
#include<iostream> #include<map> #include<string> #include<string.h> using namespace std; map<char,int> temp; map<char,int>::iterator it; struct node{ char id; int child; }; node rel[100]; int find(int x,int y) { int count=0; while(x!=y&&x!=0) { count=count+1; x=rel[x].child; } if(x==0) return 0; else return count; } int main() { int n,m,count,i,tra1,tra2,tra3; char a,b,c; while(cin>>n>>m) { if(n==0&&m==0) break; count=0; if(!temp.empty()) temp.clear(); for(i=1;i<100;i++) rel[i].child=0; for(i=1;i<=n;i++) { cin>>a>>b>>c; it=temp.find(a); if(a!='-'&&it==temp.end()) temp.insert(pair<char,int>(a,++count)); it=temp.find(b); if(b!='-'&&it==temp.end()) temp.insert(pair<char,int>(b,++count)); it=temp.find(c); if(c!='-'&&it==temp.end()) temp.insert(pair<char,int>(c,++count)); if(a!='-') tra1=temp[a]; if(b!='-'&&a!='-') { tra2=temp[b]; rel[tra2].child=tra1; } if(c!='-'&&a!='-') { tra3=temp[c]; rel[tra3].child=tra1; } } for(i=1;i<=m;i++) { cin>>a>>b; if(a=='-'||b=='-') cout<<"-"<<endl; else { int tra1,tra2,count1,count2; tra1=temp[a]; tra2=temp[b]; count1=find(tra1,tra2); count2=find(tra2,tra1); if(count1==0&&count2==0) cout<<"-"<<endl; else if(count1>0) { while(count1>=3) { cout<<"great-"; count1=count1-1; } while(count1>=2) { cout<<"grand"; count1=count1-1; } cout<<"parent"<<endl; } else if(count2>0) { while(count2>=3) { cout<<"great-"; count2=count2-1; } while(count2>=2) { cout<<"grand"; count2=count2-1; } cout<<"child"<<endl; } } } } return 0; }
标签:
原文地址:http://blog.csdn.net/killer_in_silence/article/details/44003501