家谱(gen)x
家谱(gen)
时间限制 2S
【问题描述】
现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
【输入格式】gen.in
输入文件由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有1000组父子关系,总人数最多可能达到50000人,家谱中的记载不超过30代。
【输出格式】gen.out
按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。
一定要学会使用map!感觉超级好用!!!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<map> 5 6 using namespace std; 7 8 int f[101]; 9 string fnow;//用于储存father's name,to add children's 节点 10 map<string,string>p; //studying,还不太会用 11 string name; 12 13 int main() 14 { 15 char a; 16 while(cin>>a) 17 { 18 if(a=='$') 19 break; 20 if(a=='#')// cin>>父亲名字 21 { 22 cin>>name; 23 if(p[name].empty()) 24 p[name]=name; 25 fnow=name; 26 } 27 if(a=='+')// cin>>孩子名字 28 { 29 cin>>name; 30 while(p[fnow]!=fnow) 31 { 32 fnow=p[fnow]; 33 } 34 p[name]=fnow; 35 } 36 if(a=='?')// 进行多次询问 37 { 38 cin>>name; 39 cout<<name<<" "<<p[name]<<endl; 40 } 41 } 42 return 0; 43 }