CUC-SUMMER-7-B

B - 最近公共祖先
HihoCoder - 1062

描述
小Ho最近發(fā)現(xiàn)了一個(gè)神奇的網(wǎng)站!雖然還不夠像58同城那樣神奇,但這個(gè)網(wǎng)站仍然讓小Ho樂在其中,但這是為什么呢?
“為什么呢壁畸?”小Hi如是問道,在他的觀察中小Ho已經(jīng)沉迷這個(gè)網(wǎng)站一周之久了茅茂,甚至連他心愛的樹玩具都棄置一邊捏萍。
“嘿嘿,小Hi空闲,你快過來看令杈!”小Ho招呼道。
“你看碴倾,在這個(gè)對(duì)話框里輸入我的名字逗噩,在另一個(gè)對(duì)話框里,輸入你的名字跌榔,再點(diǎn)這個(gè)查詢按鈕异雁,就可以查出來……什么!我們居然有同一個(gè)祖祖祖祖祖爺爺僧须?”
“誒纲刀,真是誒……這個(gè)網(wǎng)站有點(diǎn)厲害啊〉F剑”小Hi不由感嘆道示绊。
“是啊锭部,這是什么算法啊,這么厲害面褐!”小Ho也附和道拌禾。
“別2,我說的是他能弄到這些數(shù)據(jù)很厲害盆耽,而人類的繁殖樹這種層數(shù)比較淺的樹對(duì)這類算法的要求可是簡單的不得了蹋砚,你都能寫出來呢扼菠!”小Hi道摄杂。
“啊循榆?我也能寫出來析恢?可是……該從哪開始呢?”小Ho困惑了秧饮。
小Ho要面臨的問題是這樣的映挂,假設(shè)現(xiàn)在他知道了N個(gè)人的信息——他們的父親是誰,他需要對(duì)于小Hi的每一次提問——兩個(gè)人的名字盗尸,告訴小Hi這兩個(gè)人的是否存在同一個(gè)祖先柑船,如果存在,那么他們的所有共同祖先中輩分最低的一個(gè)是誰泼各?
提示:不著急鞍时,慢慢來,另外我有一個(gè)問題:挖掘機(jī)技術(shù)哪家強(qiáng)扣蜻?逆巍!
× Close 提示:不著急,慢慢來莽使,另外我有一個(gè)問題:挖掘機(jī)技術(shù)哪家強(qiáng)锐极?!

小Hi道:“這個(gè)問題也應(yīng)該是樹結(jié)構(gòu)許許多多問題中頗為經(jīng)典的一個(gè)了芳肌,如果就簡單的將父子關(guān)系視作樹結(jié)構(gòu)中的父子結(jié)點(diǎn)關(guān)系的話灵再,這個(gè)問題其實(shí)就是在問樹中兩個(gè)結(jié)點(diǎn)層數(shù)最高的公共祖先——也就是所謂的最近公共祖先,而這個(gè)問題有非常多的解決方法亿笤,分別適合于不同的場(chǎng)景翎迁,像在線算法離線算法什么的現(xiàn)在說給你聽你也不一定能夠很快理解≡鹑拢”
“但是……你不是說我能夠?qū)懗鰜淼拿丛蓿俊毙o納悶了。
“所以說我們慢慢來不要急罕拂,先教你個(gè)最簡單的法子揍异∪桑”小Hi如是說道。
“最簡單的法子……如果數(shù)據(jù)量不大的話衷掷,我完全可以直接將這兩個(gè)人的祖先全部找出來辱姨,然后取它們的交集,然后再找到其中輩分最低的一個(gè)不就行了戚嗅∮晏危”小Ho思考了會(huì)這般說道。
小Hi點(diǎn)了點(diǎn)頭道:“差不多就是這樣懦胞!當(dāng)然你也先將一個(gè)人的祖先全都標(biāo)記出來替久,然后順著另一個(gè)的父親一直向上找,直到找到第一個(gè)被標(biāo)記過的結(jié)點(diǎn)躏尉,便是它們的最近公共祖先結(jié)點(diǎn)了蚯根。”
“原來這么簡單胀糜!”小Ho笑道:“那我先去寫著了颅拦。”

輸入
每個(gè)測(cè)試點(diǎn)(輸入文件)有且僅有一組測(cè)試數(shù)據(jù)教藻。
每組測(cè)試數(shù)據(jù)的第1行為一個(gè)整數(shù)N距帅,意義如前文所述。
每組測(cè)試數(shù)據(jù)的第2~N+1行括堤,每行分別描述一對(duì)父子關(guān)系碌秸,其中第i+1行為兩個(gè)由大小寫字母組成的字符串Father_i, Son_i,分別表示父親的名字和兒子的名字痊臭。
每組測(cè)試數(shù)據(jù)的第N+2行為一個(gè)整數(shù)M哮肚,表示小Hi總共詢問的次數(shù)。
每組測(cè)試數(shù)據(jù)的第N+3~N+M+2行广匙,每行分別描述一個(gè)詢問允趟,其中第N+i+2行為兩個(gè)由大小寫字母組成的字符串Name1_i, Name2_i,分別表示小Hi詢問中的兩個(gè)名字鸦致。
對(duì)于100%的數(shù)據(jù)潮剪,滿足N<=102,M<=102, 且數(shù)據(jù)中所有涉及的人物中不存在兩個(gè)名字相同的人(即姓名唯一的確定了一個(gè)人)分唾。

輸出
對(duì)于每組測(cè)試數(shù)據(jù)抗碰,對(duì)于每個(gè)小Hi的詢問,輸出一行绽乔,表示查詢的結(jié)果:如果根據(jù)已知信息弧蝇,可以判定詢問中的兩個(gè)人存在共同的祖先,則輸出他們的所有共同祖先中輩分最低的一個(gè)人的名字,否則輸出-1看疗。

Sample Input
11
JiaYan JiaDaihua
JiaDaihua JiaFu
JiaDaihua JiaJing
JiaJing JiaZhen
JiaZhen JiaRong
JiaYuan JiaDaishan
JiaDaishan JiaShe
JiaDaishan JiaZheng
JiaShe JiaLian
JiaZheng JiaZhu
JiaZheng JiaBaoyu
3
JiaBaoyu JiaLian
JiaBaoyu JiaZheng
JiaBaoyu LinDaiyu

Sample Output
JiaDaishan
JiaZheng
-1


解法:構(gòu)造樹的時(shí)候可以有方向地存沙峻,只存父親結(jié)點(diǎn),從下向上找到第一個(gè)人的所有祖先結(jié)點(diǎn)两芳,并標(biāo)記摔寨,再從下向上找第二個(gè)人的祖先結(jié)點(diǎn),如果有某個(gè)結(jié)點(diǎn)已經(jīng)被標(biāo)記過則輸出次結(jié)點(diǎn)怖辆,否則輸出-1

代碼:

#include<iostream>
#include<string>
#include<map>
using namespace std;
struct node{
    string father;
    bool visit;
};
map<string,node> s;
void find(string a)
{
    if(s.count(a)){
        s[a].visit=1;
        if(s[a].father!="")
            find(s[a].father);
    }
    else
        s[a].visit=1;
    return;
}
string find1(string b){
    if(s.count(b)){
        if(s[b].visit==1)
            return b;
        else
            return find1(s[b].father);
    }
    else
        return "-1";
}
int main()
{
    int n;
    string a,b;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a>>b;
        s[b].father=a;
        s[b].visit=0;
    }
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a>>b;
        find(a);
        cout<<find1(b)<<endl;
        map<string,node>::iterator it;
        for(it=s.begin();it!=s.end();it++)
            it->second.visit=0;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末是复,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子竖螃,更是在濱河造成了極大的恐慌淑廊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斑鼻,死亡現(xiàn)場(chǎng)離奇詭異蒋纬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坚弱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來关摇,“玉大人荒叶,你說我怎么就攤上這事∈涫” “怎么了些楣?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宪睹。 經(jīng)常有香客問我愁茁,道長,這世上最難降的妖魔是什么亭病? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任鹅很,我火速辦了婚禮,結(jié)果婚禮上罪帖,老公的妹妹穿的比我還像新娘促煮。我一直安慰自己,他們只是感情好整袁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布菠齿。 她就那樣靜靜地躺著,像睡著了一般坐昙。 火紅的嫁衣襯著肌膚如雪绳匀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音疾棵,去河邊找鬼盗飒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛陋桂,可吹牛的內(nèi)容都是我干的逆趣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼嗜历,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宣渗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梨州,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤痕囱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后暴匠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞍恢,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年每窖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帮掉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窒典,死狀恐怖蟆炊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瀑志,我是刑警寧澤涩搓,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站劈猪,受9級(jí)特大地震影響昧甘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜战得,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一充边、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贡避,春花似錦痛黎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杀捻,卻和暖如春井厌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工仅仆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留器赞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓墓拜,卻偏偏與公主長得像港柜,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咳榜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子夏醉。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,199評(píng)論 0 25
  • 定義指針變量涌韩,如果不賦給它地址畔柔,系統(tǒng)會(huì)隨機(jī)給它分配一個(gè)地址。 C++標(biāo)準(zhǔn)庫 C++ Standard Librar...
    縱我不往矣閱讀 288評(píng)論 0 1
  • 原文鏈接 B樹 1.前言: 動(dòng)態(tài)查找樹主要有:二叉查找樹(Binary Search Tree)臣樱,平衡二叉查找樹(...
    非典型程序員閱讀 1,153評(píng)論 0 3
  • 項(xiàng)目-->xx(工程)屬性 -->配置屬性-->c/c++-->命令行添加: /D _CRT_SECURE_NO_...
    sharpeye_nba閱讀 2,123評(píng)論 0 0
  • 姓名:巴桂成 公司:寧波大發(fā)化纖有限公司 寧波盛和塾《六項(xiàng)精進(jìn)》235期學(xué)員 【日精進(jìn)打卡第154天】 【知~學(xué)習(xí)...
    巴桂成_c6dd閱讀 164評(píng)論 0 0