HDU 4008 樹型DP 樹兒子兄弟判斷

2022-08-23 17:57:11 字數 2902 閱讀 1571

題目:parent and son

題意:輸入n,q,接著輸入n-1條邊,組成樹,結點以1-n命名。

然後輸入q個提問,每個提問輸入x,y(x!=y),表示當以x為樹的根結點時,求y的最小兒子和最小子孫。

解題思路:

以1為根,進行dfs遍歷,dp每個結點的最小兒子和最小子孫,注意最小兒子要包括其father,方便後面處理。

有了這些資訊後,對每個提問x,y。分三種情況:

s第一種情況:當y==1時,x肯定是y的兒子。這個要特殊處理,因為上面獲得資訊不能取得其最優解。因為dfs結果的最小子孫sx有可能跟x在同一棵子樹上,那麼當以x為樹根時,y的最小子孫肯定不是sx。所以結點1要預先處理。找出其最小的子孫sx1,並記錄其的次根son1,也即是根的兒子,同理找出次小子孫sx2,son2。這樣對每提問x,y,若y==1,則判斷x是否為son1或為son1的子孫,若是,則y的最小子孫為sx2,否則為sx1。

第二種情況:當x為y的子孫時,很容易得y的最小子孫是1,這就為什麼預處理時以1為根進行dfs的原因^_^。最小兒子也不難判定。

第三種情況:這種情況與以1為根的情況相同。最小子孫即dfs求得的最小子孫,兒子是除father外的子孫,所以要記錄最小與次小兒子。當最小兒子是其father時,則其最小兒子是次小兒子。

還有乙個問題是如何判斷x是y的兒子呢?有很多種方法,這裡用了dfs的性質,記錄每個結點的進入棧時間和退出棧時間,當x的時間段在y的時間段內則表明x是y的兒子。這題只需判斷兒子,足夠了。

view code

1

#include

<

iostream

>

2#include

<

cstdio

>

3#include

<

string

>

4#include

<

cstring

>

5#include

<

algorithm

>

6#include

<

vector

>

7#include

<

map>89

using

namespace

std;

10const

intmax

=100000+10

;11const

intinf

=0x7fffffff;12

13struct

ttree

14tree[max *10

];18

intn, q, end;

19int

next[max];

20int

b[max], e[max];

21int

mindescendant[max], minson1[max], minson2[max];

22int

time;

2324

void

init(

intn)

2532

end =n;

33time =0

;34}35

intgetmin(

inta,

intb)

3639

void

addedge(

intfrom,

intto)

4046

47void

dfs(

intfather,

intnode)

4863

else

if(tree[ix].node

<

minson2[node])

64minson2[node]

=tree[ix].node;65}

66e[node]

=time++;

67}6869

bool

isdescendant(

intx,

inty)

7073

74int

main()

7590

dfs(inf, 1);

91int

min1

=inf, min2

=inf, son1

=inf, son2

=inf;

92for

(int

ix =

tree[

1].next; ix !=0

; ix

=tree[ix].next)

93102

else

if(min

<

min2)

103107

}108

intminson

=inf, mindescendant

=inf;

109for

(inti =

1; i

<=

q; ++

i)110

123else

if(isdescendant(x, y))

124131

else

132139

if(minson

!=inf

&&mindescendant

!=inf)

140printf(

"%d %d\n

", minson, mindescendant);

141else

142printf(

"no answers!\n");

143}

144printf("\n

");145}

146return0;

147}

樹型DP入門

題意 某公司要舉辦一次晚會,但是為了使得晚會的氣氛更加活躍,每個參加晚會的人都不希望在晚會中見到他的直接上司,現在已知每個人的活躍指數和上司關係 當然不可能存在環 求邀請哪些人 多少人 來能使得晚會的總活躍指數最大。思路 任何乙個點的取捨可以看作一種決策,那麼狀態就是在某個點取的時候或者不取的時候,...

樹型DP 選課

大學裡實行學分。每門課程都有一定的學分,學生只要選修了這門課並考核通過就能獲得相應的學分。學生最後的學分是他選修的各門課的學分的總和。每個學生都要選擇規定數量的課程。其中有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能選修。例如,資料結構 必須在選修了 高階語言...

hdu 1011 樹型DP(依賴揹包)

題意 你作為星河站隊的leader,手下有m個trooper 現在讓你去攻占乙個基地 有n個洞穴組成,入口是洞穴1,洞穴之間用n 1條邊鏈結,每個洞穴裡面包括x個 bugs,和他們的brains,你的每個trooper可以消滅20個bugs 問你最多可以得到多少個brains。需要注意的是 你沒做過...