希望更好的閱讀體驗?點這裡
生物學家yy研究出一種香料樹,這種樹起初只有一截樹枝,每個樹枝成長的第一年後頂端會分成多個新的子樹枝(也可能分成 0
00 個子樹枝)。樹枝隨著年份的增加,其樹皮的香味越發濃郁。
多年過去了,這棵香料樹一直在不斷的分出新的樹枝。現在yy想知道,這棵香料樹年份有k年的樹枝有多少。
現在給你這棵樹的樹枝個數 n
nn(編號 1∼n
1 \sim n
1∼n ,編號 1
11 的樹枝是最初的樹枝,其他樹枝編號沒有規律),以及所有父樹枝 u
uu ,子樹枝 v
vv 的關係對,請你找出年份達到 k
kk
00 年。
第一行兩個數字 n
nn 和 k
kk ;
以下 n−1
n-1n−
1 行,每行乙個 u,v
u,vu,
v 關係對;
第一行,乙個整數,表示年份達到 k
kk 年的樹枝個數。
第二行,按編號由小到大,輸出年份達到 k
kk 年的樹枝的編號。
10 1
1 77 3
3 47 5
7 81 10
10 6
5 98 2
4
3 5 6 8
對於40%的資料:10≤n
≤100
10 \le n \le 100
10≤n≤1
00;對於100%的資料:10≤n
≤106
10 \le n \le 10^6
10≤n≤1
06;觀察樣例:
可以發現年份為 k
kk 指的就是從深度最大的葉子結點往上數第 k
kk 個位置,而這個位置的深度就是整棵樹的深度與 k
kk 的差。所以只需要求樹的深度,再對每個點判斷就好了。
#include
struct nodee[
1000003];
//正常的無根樹都是要用雙向邊的,但因為本題輸入中已經給定了父子關係,故只用單向邊
int n,k;
int head[
1000003
],len;
int maxd,dep[
1000003]=
;//maxd為整棵樹的深度,dep為每個結點的深度,dep[1]=1
int s,a[
1000003];
//s表示個數,a儲存符合要求的結點
void
dfs(
int x,
int fa)
}void
add(
int&u,
int&v)
intmain()
dfs(1,
0);for
(int i=
1;i<=n;i++)if
(dep[i]
==maxd-k)
++s,a[s]
=i;printf
("%d\n"
,s);
for(
int i=
1;i<=s;i++
)printf
("%d "
,a[i]);
return0;
}
DFS 牌型種數
小明被劫持到x賭城,被迫與其他3人玩牌。一副撲克牌 去掉大小王牌,共52張 均勻發給4個人,每個人13張。這時,小明腦子裡突然冒出乙個問題 如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?請填寫該整數,不要填寫任何多餘的內容或說明文字。先介紹一...
歷屆試題 牌型種數 (dfs)
小明被劫持到x賭城,被迫與其他3人玩牌。一副撲克牌 去掉大小王牌,共52張 均勻發給4個人,每個人13張。這時,小明腦子裡突然冒出乙個問題 如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?思路 求牌的組合總數,每種牌有5種可能,取0 4張,當取...
dfs 樹 機器選擇
有乙個樹狀的圖,要求安乙個點,使這個點到最遠的點的距離最小 第1行 乙個整數n。第2n行 兩個整數u v,即u v兩台機器間有一條網線連線。機器從1n編號。輸入資料保證是乙個連通的樹型結構。1行乙個整數,即最短的時間。5 3 22 1 5 22 41 資料範圍 對於30 的資料,n 100 對於50...