小韋老師 神犇營 my0414 家譜

2021-10-01 06:10:13 字數 1837 閱讀 8610

現代的人對於本家族血統越來越感興趣,現在給出充足的父子關係,請你編寫程式找到某個人的最早的祖先。

輸入由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係由二行組成,用 #name 的形式描寫一組父子關係中的父親的名字,用 +name 的形式描寫一組父子關係中的兒子的名字;接下來用 ?name 的形式表示要求該人的最早的祖先;最後用單獨的乙個 $ 表示檔案結束。規定每個人的名字都有且只有 6 個字元,而且首字母大寫,且沒有任意兩個人的名字相同。最多可能有 1000 組父子關係,總人數最多可能達到 50000 人,家譜中的記載不超過 30 代。

按照輸入的要求順序,求出每乙個要找祖先的人的祖先,每一行的格式:本人的名字+乙個空格+祖先的名字。

#george

+rodney

#arthur

+gareth

+walter

#gareth

+edward

?edward

?walter

?rodney

?arthur

$

edward arthur

walter arthur

rodney george

arthur arthur

整體思路:

這道題就是考查並查集,只是兒子和父親從之前的整數都變成了字串。

回顧之前我們用 int father 來儲存並查集,做的是 兒子(整數)->父親(整數) 的對映,而此處我們需要做 兒子(字串)->父親(字串) 的對映,因此可以用 map 來完成。

其餘的做法與一般的並查集一樣。

具體步驟:

定義乙個 map,用來做 兒子(字串)->父親(字串) 的對映:

// 相當於乙個下標為字串型別,值也為字串型別的陣列 

mapfather;

定義 4 個字串:

string str;  // 暫存輸入的字串 

string fa; // 儲存父親

string child; // 儲存孩子

string query; // 查詢

一直輸入乙個字串,若輸入的字串為 $,則退出迴圈結束;否則做以下的操作:

if (str[0] == '#') 

else if (str[0] == '+')

else if(str[0]=='?')

4.實現查詢函式:

// 查詢 x 所在集合的根 

string findfather(string x)

return x;

}

思考:

1° 這道題的知識點可以分解為:並查集 + map,你能自己總結一下 map 的常用操作嗎?順便也可以總結下其他 stl 容器。

2° 這道題讓你對並查集有了哪些新的認識和理解?

完整**:

#include using namespace std;

// 用來儲存 兒子-> 父親 的對映

// 相當於乙個下標為字串型別,值也為字串型別的陣列

mapfather;

// 查詢 x 所在集合的根

string findfather(string x)

return x;

}int main()

else if (str[0] == '+')

else if(str[0]=='?')

}return 0;

}

我是小韋老師,企者不立,跨者不行,每天進步一點點。

小韋老師 神犇營 my0049 登入驗證

描述 我們在登入 的時候需要驗證密碼是否正確。現在請你寫乙個程式來驗證登入密碼是否正確。密碼為 5 位數。本題的輸入共 5 行,前 4 行是存進去的 4 個密碼,第 5 行是需要驗證的密碼,需要驗證該密碼是否為存進去的第三個密碼,若是,則輸出 yes 否則輸出 no 輸入本題的輸入共 5 行,前 4...

小韋老師 神犇營 my0184 開關燈

假設有 n 盞燈 n 為不大於 5000 的正整數 從 1 到 n 按順序依次編號,初始時全部處於開啟狀態 有 m 個人 m 為不大於 n 的正整數 也從 1 到 m 依次編號。第乙個人 1 號 將燈全部關閉,第二個人 2 號 將編號為 2 的倍數的燈開啟,第三個人 3號 將編號為 3 的倍數的燈做...

小韋老師 神犇營 my0163 完全數

求正整數 2 和 n 之間的完全數 一行乙個數 完全數 因子之和等於它本身的自然數,如 6 1 2 3 輸入n 1 n 5000 一行乙個數,按由小到大的順序。76破題 考查因子的概念和自定義函式。因子意思是 a 能被 b 整除 a b 0 則說明 b 是 a 的因子。思路 1.首先定義變數 n,並...