hdu 4714由樹變成環

2021-06-23 06:17:34 字數 610 閱讀 9062

用到了手動擴棧

要求用最少的操作把一顆樹轉化成乙個環。其實就是把樹分成最少的鏈,然後連線起來即可,仔細觀察樹的話會發現,一般乙個點的度如果大於1的話,該點必然要斷開一些連線,因為最終每個點的度都是2, 然後就是看點上斷開那些連線了,其實,如果乙個節點的除去父親節點如果度大於1的話,斷開與父親節點的那條邊必然是一種正解。。。於是問題就解決了,只需一遍dfs即可。在杭電交注意加上掛。。。不然會爆棧。。。

#pragma comment(linker,"/stack:102400000,102400000")

#include#include#define n 1000100

using namespace std;

vectorg[n];

int ans;

int dfs(int u,int fa)

return 1;

}int main()

ans=0;

dfs(1,-1);

printf("%d\n",ans+ans+1);//拆成n部分需要刪除n-1條邊,即n-1花費,連線n部分需要 n 花費,ans=n-1;

} return 0;

}

hdu4714樹形DP,用c 交別用g 交

題 題意 給你一顆n個節點的樹,你可以刪除或者新增一些邊,代價都是1。問 要把這棵樹變成乙個環,至少需要多少代價?對於一顆樹 子樹 如果他的兒子數超過1,則需要改動,如果他有父親節點,那麼代價是 son 2 2 先拆再連 將這顆子樹變成乙個鏈 如果這個點是root,代價是 son 1 2,畫圖腦補 ...

hdu 3367 最大生成樹 判環

不能最大生成樹 最大的一條邊,但是為什麼呢?if fx fy 如果兩棵樹上不是都有回環,那麼可以合併,fx掛在fy上,如果其中乙個有環,fy標記為有環 if fx fy circle x circle y 如果兩棵樹上都沒有回環,那麼x和y還能合併,環數變為1 include includeusin...

HDU6370 Werewolf 基環內向樹

hdu6370 werewolf 有 n 個人玩狼人殺,只有村民和狼人,每個人指定另乙個人並指出乙個身份,其中 村民是不會說謊的,狼人是有可能說謊的,問在所有情況下必然是狼人的人數和必然是村民的人數分別有多少 首先所有人都有可能說謊,所以不可能有人必然是村民 接下來我們考慮是否有人必然是狼人,我們考...