SAC E 1 一道難題 Tree(樹形DP)

2022-02-27 07:00:04 字數 1260 閱讀 9236

冴月麟和魏瀟承是好朋友。

冴月麟為了守護幻想鄉,而製造了幻想鄉的倒影,將真實的幻想鄉封印了。任何人都無法進入真實的幻想鄉了,但是她給前來救她的魏瀟承留了乙個線索。

她設定了一棵樹(有根)。樹的每一條邊上具有割掉該邊的代價。

魏瀟承需要計算出割開這棵樹的最小代價,這就是冴月麟和魏瀟承約定的小秘密。

幫幫魏瀟承吧。

注:所謂割開一棵有根樹,就是刪除若干條邊,使得任何任何葉子節點和根節點不連通。

輸入格式:

輸入第一行兩個整數n,s表示樹的節點個數和根。

接下來n-1行每行三個整數a、b、c,表示a、b之間有一條代價為c的邊。

輸出格式:

輸出包含一行,乙個整數,表示所求最小代價。

好坑啊。。。空間卡的好嚴,用定長陣列存邊調了半天才卡過去

這道題很多人用的費用流,但我不會

很多人用的鄰接表,但我比較懶

這道題其實我們可以這樣想:

因為這是一棵樹,所以我們可以想到樹形dp

我們從根節點往下走,一直到葉子節點

因為要求的是割掉所有子結點,那麼我們有兩種選擇

要麼割掉這個子節點上連的邊

要麼割掉某個與他祖先連的邊

於是,我們的dp陣列表示的就是在i點時,割掉與他所轄的所有的葉子節點的最小代價

怎麼轉移呢?

我們知道從乙個祖先點往下,如果想要割掉他的所有子樹所轄的所有子節點

要麼割掉他與那個子樹相連那條邊

要麼我們割掉與子樹相連的所有非返祖邊

這樣就是乙個dp

每次枚舉子樹

要麼割掉邊,要麼割掉子樹

取最小代價

一層層遞迴向上

根節點就是答案

#include#include

#define rii register int i

using

namespace

std;

struct

bianx[

100001

];long

long dp[100001

],n,root;

void dplast(int wz,int

fa)

for(rii=1;i<=x[wz].sl;i++)

}}int

main()

for(rii=1;i<=n;i++)

}dplast(root,0);

cout

<}

SAC E 1 一道難題 Tree

冴月麟和魏瀟承是好朋友。冴月麟為了守護幻想鄉,而製造了幻想鄉的倒影,將真實的幻想鄉封印了。任何人都無法進入真實的幻想鄉了,但是她給前來救她的魏瀟承留了乙個線索。她設定了一棵樹 有根 樹的每一條邊上具有割掉該邊的代價。魏瀟承需要計算出割開這棵樹的最小代價,這就是冴月麟和魏瀟承約定的小秘密。幫幫魏瀟承吧...

P3931 SAC E 1 一道難題 Tree

題目描述 冴月麟為了守護幻想鄉,而製造了幻想鄉的倒影,將真實的幻想鄉封印了。任何人都無法進入真實的幻想鄉了,但是她給前來救她的魏瀟承留了乙個線索。她設定了一棵樹 有根 樹的每一條邊上具有割掉該邊的代價。魏瀟承需要計算出割開這棵樹的最小代價,這就是冴月麟和魏瀟承約定的小秘密。幫幫魏瀟承吧。注 所謂割開...

SAC E 1 一道中檔題 Factorial

sol君 爐石主播 和sol菌 完美資訊教室講師 是好朋友。sol君很喜歡階乘。而sol菌很喜歡研究進製。這一天,sol君跟sol菌炫技,隨口算出了n的階乘。sol菌表示不服,立刻就要算這個數在k進製表示下末尾0的個數。但是sol菌太菜了於是請你幫忙。輸入格式 每組輸入僅包含一行 兩個整數n,k。輸...