題目: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。需要注意的是 你沒做過...