家譜 要測試數據的在評論裡發聯系方式,家譜聯系方式
家譜(gen)
時間限制 2S
【問題描述】
現代的人對於本家族血統越來越感興趣,現在給出充足的父子關系,請你編寫程序找到某個人的最早的祖先。
【輸入格式】gen.in
輸入文件由多行組成,首先是一系列有關父子關系的描述,其中每一組父子關系由二行組成,用#name的形式描寫一組父子關系中的父親的名字,用+name的形式描寫一組父子關系中的兒子的名字;接下來用?name的形式表示要求該人的最早的祖先;最後用單獨的一個$表示文件結束。規定每個人的名字都有且只有6個字符,而且首字母大寫,且沒有任意兩個人的名字相同。最多可能有1000組父子關系,總人數最多可能達到50000人,家譜中的記載不超過30代。
【輸出格式】gen.out
按照輸入文件的要求順序,求出每一個要找祖先的人的祖先,格式:本人的名字+一個空格+祖先的名字+回車。
【輸入樣例】
#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
【輸出樣例】
Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur
思路:核心思想有點類似於並查集
用map實現比較方便
題目不難,注意把握好其中的邏輯關系,分類討論
缺點:在這份代碼之下Dev c++的調試功能形同虛設
1 #include<iostream>
2 #include<map>
3 #include<cstdio>
4 #include<cstring>
5 using namespace std;
6 int f[101];
7 string fanow;//儲存當前父親的名字,以便於添加孩子節點
8 map<string,string>p;
9 string name;
10 int main()
11 {
12 char a;
13 while(cin>>a)
14 {
15 if(a=='$')
16 break;
17 if(a=='#')// 父親名字
18 {
19 cin>>name;
20 if(p[name].empty())
21 p[name]=name;
22 fanow=name;
23 }
24 if(a=='+')// 孩子名字
25 {
26 cin>>name;
27 while(p[fanow]!=fanow)
28 {
29 fanow=p[fanow];
30 }
31 p[name]=fanow;
32 }
33 if(a=='?')// 進行詢問
34 {
35 cin>>name;
36 cout<<name<<" "<<p[name]<<endl;
37 }
38 }
39 return 0;
40 }