【并查集】家谱(luogu 2814/ssl 2343)
生活随笔
收集整理的這篇文章主要介紹了
【并查集】家谱(luogu 2814/ssl 2343)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
家譜
luogu 2814
ssl 2343
題目大意:
給一堆父子關系,求出一些人的最大的祖先
原題:
題目背景
現代的人對于本家族血統越來越感興趣。
題目描述
給出充足的父子關系,請你編寫程序找到某個人的最早的祖先。
輸入輸出格式
輸入格式:
輸入由多行組成,首先是一系列有關父子關系的描述,其中每一組父子關系中父親只有一行,兒子可能有若干行,用#name的形式描寫一組父子關系中的父親的名字,用+name的形式描寫一組父子關系中的兒子的名字;接下來用?name的形式表示要求該人的最早的祖先;最后用單獨的一個$表示文件結束。
輸出格式:
按照輸入文件的要求順序,求出每一個要找祖先的人的祖先,格式:本人的名字+一個空格+祖先的名字+回車。
輸入輸出樣例
輸入樣例#1:
#George +Rodney #Arthur +Gareth +Walter #Gareth +Edward ?Edward ?Walter ?Rodney ?Arthur $輸出樣例#1:
Edward Arthur Walter Arthur Rodney George Arthur Arthur說明
規定每個人的名字都有且只有6個字符,而且首字母大寫,且沒有任意兩個人的名字相同。最多可能有1000組父子關系,總人數最多可能達到50000人,家譜中的記載不超過30代。
題目大意:
直接同map把關系存起來,然后并查集
代碼:
#include<map> #include<cstdio> #include<string> #include<cstring> #include<iostream> using namespace std; string str,strr,str1,strr1; char x; map<string,string>dad;//map好東西 string find(string dep){return dad[dep]==""?dep:dad[dep]=find(dad[dep]);}//并查集 char gc() {char xx;cin>>xx;while (xx=='\n'||xx==' ') cin>>xx;//跳過空格和換行符return xx; } int main() {x=gc();while(x!='$'){cin>>str;if (x=='#'){while ((x=gc())=='+')//他的所有兒子{cin>>strr;dad[find(strr)]=find(str);//記錄}//因為會把下一次的也輸進去,所以不用再輸入了}else if (x=='?') cout<<str<<" "<<find(str)<<endl,x=gc();//輸出,順便輸入} }總結
以上是生活随笔為你收集整理的【并查集】家谱(luogu 2814/ssl 2343)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让电脑再也不受卡顿的折磨不容易卡顿的电脑
- 下一篇: 如何隐藏无线路由器信号不让别人看到怎么把