題目連結:
題目大意:
輸入第一列給定一字串 root (root 不含空白字元)以及兩整數 n 、 m ,代表祖先的名字以及其有著 n 個子孫,最後有 m 筆的詢問。接著有 n 列輸入,每列給定兩字串 a 、 b,代表 a 生下了 b。而輸入的順序代表著出生的先後(即越先輸入的越先出生)。
最後有 m 列輸入,每列給定一正整數 k。試問家族第 k 代的人(即與祖先有著相同血緣距離)有哪些?請將這些人按照族譜分枝順序(兄弟姐妹們中某人最早生下後代的話即為最早的分枝,也因此同一個人生的孩子應排在一起)且由出生順序先到後排後輸出。
範例輸入:
範例輸入 #1
lvpb 9 6
lvpb ndml
ndml uods
uods ytaq
lvpb bpet
ytaq gdpq
ndml dswt
ytaq yzoa
uods pmhu
gdpq pcbj
1
3
6
5
4
2
範例輸入 #2
a 12 4
a b
a c
c d
c e
a f
b g
f h
b i
f j
e k
d l
g m
1
2
3
4
範例輸出:
範例輸出 #1
lvpb
uods dswt
pcbj
gdpq yzoa
ytaq pmhu
ndml bpet
範例輸出 #2
a
b c f
g i d e h j
m l k
解題思維:
可以先照一般方式建立成一個家族樹(如
這題,不過該題是二元樹),不過可以利用額外的表來記錄每個人在樹中的何處,這樣新增的時候便不用每個節點都跑過一次。
接著利用廣度優先搜尋(Breadth First Search,BFS)掃過一次家族樹然後對每一代按題目的要求排序。不過這個 BFS 的步驟其實在建立的時候便可以順便建立完每一代按題目要求排序的姓名順序。
最後就是對於每筆詢問輸出相應家族代數的每個人之姓名。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。