題
題意:
給你一顆n個節點的樹,你可以刪除或者新增一些邊,代價都是1。問:要把這棵樹變成乙個環,至少需要多少代價?
對於一顆樹(子樹),如果他的兒子數超過1,則需要改動,,
如果他有父親節點,那麼代價是(son-2)*2(先拆再連),將這顆子樹變成乙個鏈
如果這個點是root,代價是(son-1)*2,(畫圖腦補)
最後改完後再把首位一連(ans++)
如果你mle或者爆棧的話死活調不過的話
把g++改成c++試試
我也不知道為什麼,,,,
當時內心已經接近崩潰了
#include
#include
#include
using
namespace
std;
const
int n=1000007;
int ans;
vector
g[n];
int dfs(int rt,int fa)
if (son>=2)
return1;}
int main()
ans = 0;
dfs(1,-1);
printf("%d\n",ans+1);
}return
0;}
hdu 4714由樹變成環
用到了手動擴棧 要求用最少的操作把一顆樹轉化成乙個環。其實就是把樹分成最少的鏈,然後連線起來即可,仔細觀察樹的話會發現,一般乙個點的度如果大於1的話,該點必然要斷開一些連線,因為最終每個點的度都是2,然後就是看點上斷開那些連線了,其實,如果乙個節點的除去父親節點如果度大於1的話,斷開與父親節點的那條...
HDU 1520 簡單樹形dp
題意 乙個大學要舉行職工party。為使party中每個人都玩的開心,直接上司和下屬關係的員工不能同時參加。每個人都有各自的歡樂值。問如何邀請使得總歡樂值最大。dp i 1 表示選擇i點 dp i 0 表示不選擇i點 include include include include using nam...
HDU 2196 樹形dp入門
鏈結 傳送門 題意 給你乙個n個節點的棵樹,然後給你和 第i臺電腦與第a臺電腦相連的花費 v 問你最長的線路是多長 求樹上任意節點所能達到的最遠點的距離 樹形dp 開個陣列 分別記錄這個點到子樹最遠節點的最長距離和次長距離和記錄到父節點上的最長距離這樣在樹上dp 1.求子樹最長和次長 dp u 0 ...