樹型DFS 香料採摘

2021-10-09 12:00:13 字數 1764 閱讀 4228

希望更好的閱讀體驗?點這裡

生物學家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...