並查集 資訊奧賽一本通 家譜 gen

2021-08-19 16:38:58 字數 1189 閱讀 4816

時間限制: 1000 ms         記憶體限制: 65536 kb

提交數: 227     通過數: 109 

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

由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係由二行組成,用#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

#includeusing namespace std;

#define n 50100

string b[n],s1,s2;//b[i]表示編號i的名字

char ch;//在主函式定義就執行錯誤,不知道為啥

int fa[n],sum=0;

//fa[i]儲存i所在家族的最老祖先

int find(int x)

int w(string s) //將字串轉換並查集中唯一序號

int main()

{ cout<>ch;

switch(ch)

{case'#':

cin>>s1;break;

case'+':

cin>>s2;

if(s1!=s2)

fa[find(w(s2))]=find(w(s1));//利用並查集合並最早的祖先

break;

case'?':

cin>>s2;

cout<

資訊奧賽一本通 並查集 團夥 group

時間限制 1000 ms 記憶體限制 65536 kb 提交數 596 通過數 247 在某城市裡住著n個人,任何兩個認識的人不是朋友就是敵人,而且滿足 1 我朋友的朋友是我的朋友 2 我敵人的敵人是我的朋友 所有是朋友的人組成乙個團夥。告訴你關於這n個人的m條資訊,即某兩個人是朋友,或者某兩個人是...

資訊奧賽一本通 1183病人排隊

1183 病人排隊 題目描述 病人登記看病,編寫乙個程式,將登記的病人按照以下原則排出看病的先後順序 1.老年人 年齡 60歲 比非老年人優先看病。2.老年人按年齡從大到小的順序看病,年齡相同的按登記的先後順序排序。3.非老年人按登記的先後順序看病。輸入 第1行,輸入乙個小於100的正整數,表示病人...

資訊奧賽一本通1185 單詞排序

輸入一行單詞序列,相鄰單詞之間由1個或多個空格間隔,請按照字典序輸出這些單詞,要求重複的單詞只輸出一次。區分大小寫 一行單詞序列,最少1個單詞,最多100個單詞,每個單詞長度不超過50,單詞之間用至少1個空格間隔。資料不含除字母 空格外的其他字元。按字典序輸出這些單詞,重複的單詞只輸出一次。she ...