c++并查集配合STL MAP的實現(xiàn)(洛谷P2814題解)

不會并查集的話請將此文與我以前寫的并查集一同食用选调。
原題來自洛谷
原題
文字稿在此:

題目背景

現(xiàn)代的人對于本家族血統(tǒng)越來越感興趣夹供。

題目描述

給出充足的父子關系,請你編寫程序找到某個人的最早的祖先仁堪。

輸入輸出格式

輸入格式:
輸入由多行組成哮洽,首先是一系列有關父子關系的描述,其中每一組父子關系中父親只有一行弦聂,兒子可能有若干行鸟辅,用#name的形式描寫一組父子關系中的父親的名字,用+name的形式描寫一組父子關系中的兒子的名字横浑;接下來用?name的形式表示要求該人的最早的祖先剔桨;最后用單獨的一個$表示文件結束。

輸出格式:
按照輸入文件的要求順序徙融,求出每一個要找祖先的人的祖先洒缀,格式:本人的名字+一個空格+祖先的名字+回車。

輸入輸出樣例

輸入樣例#1: 
#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
輸出樣例#1: 
Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur
說明

規(guī)定每個人的名字都有且只有6個字符欺冀,而且首字母大寫树绩,且沒有任意兩個人的名字相同。最多可能有1000組父子關系隐轩,總人數(shù)最多可能達到50000人饺饭,家譜中的記載不超過30代。

map

map是STL中的一種數(shù)據(jù)結構职车,你可以理解為它是一個下表不一定 為整形的數(shù)組(也就是說瘫俊,下表可以為字符鹊杖、字符串。扛芽。骂蓖。)

map類型的聲明

大體模式式是

map<下標類型,數(shù)組每一個元素的類型> 數(shù)組名;

比如說我要一個下表是字符串川尖,每一個元素的類型也是字符串登下,名字叫a的數(shù)組,我可以這樣寫

map<string,string> a;

回到題目

會了map叮喳,相信你應該也有點思路了吧被芳?這是 建立在并查集基礎上的,不會并查集的話馍悟,可以看看我以前寫的并查集畔濒。
有了map我們就可以使用 真正意義上的字符串數(shù)組來編程了!8畴篓冲!

函數(shù)

這里面的getfather函數(shù) 變異了,他成了這樣

string getfather(string x)//找x的根結點
{//這其實是一個遞歸函數(shù)
    if(father[x]!=x)
    {
        return getfather(father[x]);//它會一級一級找上去(先找到它爸爸宠哄,在找到它爸爸的爸爸,再找到它爸爸的爸爸的爸爸嗤攻。毛嫉。。妇菱。承粤。)
    }
    else
    {
        return father[x];//邊界條件,如果x的根結點就是x(也就是說它沒有更上邊的祖宗了)
    }
}

相較以前的getfather闯团,首先函數(shù)的類型成了string辛臊,而且x的類型也是string。但是作用和以前是一樣的房交。

讀入

這題的讀入很特殊彻舰,因為這道題要邊讀入邊處理邊輸出


char c;//就是名字 前面那個字符
string s,fat;//s是名字,fat是是用來暫存先提及的父親的名字的

這題我用了這幾個變量候味。
核心代碼如下

map<string,string> father;//用來存儲某一點的根結點
    cin>>c;//讀入c
    while(c!='$')//只要c不是$就會執(zhí)行
    {
        cin>>s;//讀入名字
        if(c=='#')//假如讀到了父親 的名字
        {
            fat=s;//fat暫存父親的名字刃唤,因為過一會兒s的值會變
            if(father[s]=="")    father[s]=s;//如果father[s]的值為空,也就是說s就是自己的根結點(找到底了)
        }
        if(c=='+')//如果s是表示兒子
        {
            father[s]=fat;//s的根結點就成了fat(上面說的fat這是就派上了用場)
        }
        if(c=='?')//查集
        {
            cout<<s<<' '<<getfather(father[s])/*輸出father[s]的根結點*/<<endl;
        }
        cin>>c;//讀入c白群,開始新一輪的循環(huán)
    }

完整程序如下

#include<map>
#include<iostream>
using namespace std;
map<string,string> father;
string getfather(string x)
{
    if(father[x]!=x)
    {
        return getfather(father[x]);
    }
    else
    {
        return father[x];
    }
}
int main()
{
    char c;
    string s,fat;
    cin>>c;
    while(c!='$')
    {
        cin>>s;
        if(c=='#')
        {
            fat=s;
            if(father[s]=="")    father[s]=s;
        }
        if(c=='+')
        {
            father[s]=fat;
        }
        if(c=='?')
        {
            cout<<s<<' '<<getfather(father[s])<<endl;
        }
        cin>>c;
    }
    return 0;
}

總結

這題其實和并查集的模版的差異并不大尚胞,只是涉及到STL中的數(shù)據(jù)結構map的使用。所以對于提高+的評價感覺是過了點帜慢,但要是不會map的話可能真的是這個難度了笼裳。
如果字符串功底夠好唯卖,也可以 考慮用字符串/字符 數(shù)組來實現(xiàn)(我字符串功底不好。躬柬。)

tks耐床。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市楔脯,隨后出現(xiàn)的幾起案子撩轰,更是在濱河造成了極大的恐慌,老刑警劉巖昧廷,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堪嫂,死亡現(xiàn)場離奇詭異,居然都是意外死亡木柬,警方通過查閱死者的電腦和手機皆串,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眉枕,“玉大人恶复,你說我怎么就攤上這事∷偬簦” “怎么了谤牡?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姥宝。 經(jīng)常有香客問我翅萤,道長,這世上最難降的妖魔是什么腊满? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任套么,我火速辦了婚禮,結果婚禮上碳蛋,老公的妹妹穿的比我還像新娘胚泌。我一直安慰自己,他們只是感情好肃弟,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布玷室。 她就那樣靜靜地躺著,像睡著了一般愕乎。 火紅的嫁衣襯著肌膚如雪阵苇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天感论,我揣著相機與錄音绅项,去河邊找鬼。 笑死比肄,一個胖子當著我的面吹牛快耿,可吹牛的內(nèi)容都是我干的囊陡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掀亥,長吁一口氣:“原來是場噩夢啊……” “哼撞反!你這毒婦竟也來了?” 一聲冷哼從身側響起搪花,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遏片,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撮竿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吮便,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年幢踏,在試婚紗的時候發(fā)現(xiàn)自己被綠了髓需。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡房蝉,死狀恐怖僚匆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搭幻,我是刑警寧澤咧擂,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站粗卜,受9級特大地震影響屋确,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜续扔,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望焕数。 院中可真熱鬧纱昧,春花似錦、人聲如沸堡赔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善已。三九已至灼捂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間换团,已是汗流浹背悉稠。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艘包,地道東北人的猛。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓耀盗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卦尊。 傳聞我的和親對象是個殘疾皇子叛拷,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,234評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法岂却,內(nèi)部類的語法忿薇,繼承相關的語法,異常的語法躏哩,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,383評論 0 5
  • 人在一定年齡的時候署浩,越來越覺得自己孤單!自認為懂你的人震庭,實然并不懂你瑰抵!認為不懂你的人!確能在不經(jīng)意間說到你心靈深處...
    竹節(jié)韻閱讀 344評論 0 3
  • 2018.04.12
    4月的小猴子閱讀 143評論 0 0