樹形DP 愛心蝸牛

2021-05-28 17:52:32 字數 2479 閱讀 4763

愛心蝸牛

提交檔案:badnews.pas/c/cpp

輸入檔案:badnews.in

輸出檔案:badnews.out 

貓貓把嘴伸進池子裡,正準備「吸」魚吃,卻聽到門鈴響了。貓貓擦了擦臉上的水,開啟門一看,那人正是她的好朋友——川川。

川川手裡拿著一輛玩具汽車,對貓貓說:「這是我的新汽車!」接著,伴隨一陣塑料叩擊聲,玩具汽車的車門竟開了,乙隻蝸牛慢慢吞吞爬了出來。

「哇!這麼大的蝸牛……」貓貓驚訝道。

「這是我的寵物蝸牛,他叫點點。」川川介紹道。

「把他送給我好嗎?」貓貓央求道。

「可以讓他陪你幾天,但是不能送給你……」

點點沿著川川的身體,爬到了地上,又移到了貓貓的池子旁邊,只聽見貓貓向川川介紹她的「創意吃魚法」,心裡不禁起了一絲涼意:「這個女生太毒了……吃魚前還要玩魚……」轉眼一看,池中的魚依舊暢快地游來游去。

「或許這些魚聽不懂貓語吧……好在我會一點兒貓語,也會一點魚語……阿彌陀佛,善哉善哉。我還是救救這些魚吧……」點點自言自語,一邊費力地移動著身軀。他認識到——單憑自己的力量,把貓貓的陰謀告訴每一條魚,似乎不太可能——自己底盤太低,走不快,看來只得想其他辦法來傳達資訊。一翻認真思考之後,點點想到,如果把貓貓的計畫告訴其中一條魚,再讓魚們互相傳達訊息,那麼在相對較短的時間內,每條魚都會得知貓貓的計畫。

魚們的社會等級森嚴,除了國王菜魚之外,每條魚均有且只有乙個直接上級,菜魚則沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。

絕對不會出現這樣兩條魚a、b:a是b的上級,b也是a的上級。

最開始的時刻是0,點點要做的,就只是用1單位的時間把貓貓的陰謀告訴某一條「資訊源魚」,讓魚們自行散布訊息。在任意乙個時間單位中,任何一條已經接到通知的魚,都可以把訊息告訴他的乙個直接上級或者直接下屬。

現在,點點想知道:

1.到底需要多長時間,訊息才能傳遍池子裡的魚?

2.使訊息傳遞過程消耗的時間最短,可供選擇的「資訊源魚」有那些? 

輸入資料:

第一行有乙個數n(n≤1000),表示池中的魚數,池魚按照1到n編上了號碼,國王菜魚的標號是1。

第2行到第n行(共n-1行),每一行乙個數,第i行的數表示魚i的直接上級的標號。 

輸出資料:

對於每組輸入資料:

第一行有乙個數,表示最後一條魚接到通知的最早時間。

第二行有若干個數,表示可供選擇的魚f的標號,按照標號從小到大的順序輸出,中間用空格分開。 

輸入樣例:

3 輸出樣例:

3 4 5 6 7

type

pnode=^node;

node=record

x:longint;

next:pnode;

end;

var n:longint;

map:array[1..1000]of pnode;

ans:longint;

ansi:array[1..1000]of longint;

f_bo:array[1..1000]of boolean;

c:array[1..1000,1..1000]of longint;

cs:array[1..1000]of longint;

anss:longint;

procedure init;

begin

assign(input,'badnews.in');

assign(output,'badnews.out');

reset(input); rewrite(output);

end;

procedure terminate;

begin

close(input); close(output);

halt;

end;

procedure insert(a,b:longint);

var p:pnode;

begin

new(p);

p^.next:=map[a];

p^.x:=b;

map[a]:=p;

end;

procedure qsort(s,t,n:longint);

var i,j:longint;

tem:longint;

x:longint;

begin

i:=s; j:=t;

x:=c[n,(s+t)shr 1];

repeat

while xj;

if inil do

begin

if f_bo[p^.x] then

begin

inc(cs[t]);

c[t,cs[t]]:=dfs(p^.x);

end;

p:=p^.next;

end;

if cs[t]=0 then exit(0);

qsort(1,cs[t],t);

for i:=1 to cs[t] do

if dfs

樹形DP 樹形DP四例

是時候練一下dp了!我的題單 portkey f u,if fu,i 表示以u uu為根節點的子樹中保留i ii條樹枝的最大蘋果數 f u,i max f max f fu,i max這些題是菜,但也不能輕視啊!include using namespace std define in read i...

HLOJ 樹形DP前置 DFS(樹形DP入門)

給定一棵 n nn 個點的樹,根為 t tt求每個點的父親是哪個點,t tt 的父親輸出 0 00第一行兩個整數 n,t n,tn,t接下來 n 1 n 1n 1 行,每行兩個整數 x,y x,yx,y,表示 x,y x,yx,y 之間有一條邊 n nn 行,第 i ii 行乙個整數,表示 i ii...

樹形dp小結

這些天做了一些樹形dp的題目,感覺有了些領悟,尤其是理解到樹形揹包就是分組揹包之後。選出幾道不錯的總結一下 hdu 1520 hdu 4003 poj 1155 poj 2486 hdu 4313 hdu 4340 hdu 1520 入門水題 每個節點有權值,子節點和父節點不能同時選,問最後能選的最...