bzoj3257 樹的難題

2021-08-14 15:01:38 字數 1926 閱讀 4304

description

給出乙個無根樹。樹有n個點,邊有權值。每個點都有顏色,是黑色、白色、

灰色這三種顏色之一,稱為一棵三色樹。

可愛的 alice覺得,乙個三色樹為均衡的,當且僅當,樹中不含有黑色結點

或者含有至多乙個白色節點。然而,給出的三色樹可能並不滿足這個性質。

所以,alice打算刪去若干條邊使得形成的森林中每棵樹都是均衡的,花費

的代價等於刪去的邊的權值之和。請你計算需要花費的代價最小是多少。

注意,輸入檔案包含多組測試資料。

input

第一行包含乙個正整數 t,表示有 t組測試資料。接下來依次是 t組測試數

據。每組測試資料的第一行包含乙個正整數 n。

第二行包含 n個 0、1、2之一的整數,依次表示點 1到點 n的顏色。其中,

0 表示黑色,1表示白色,2表示灰色。

接下來 n-1行,每行為三個整數ui、vi、c i,表示一條權值等於ci的邊(ui, vi)。

output

輸出 t行,每行乙個整數,依次表示每組測試資料的答案。

sample input

1 5

0 1 1 1 0

1 2 5

1 3 3

5 2 5

2 4 16

sample output

10 hint

花費 10的代價刪去邊(1, 2)和邊(2, 5)。

對於 100%的資料:1 ≤ n ≤ 300 000 ,1 ≤ t ≤ 5 ,0 ≤ ci<=10^9

覺得real非常非常妙的題啊 %了icefox以後才會做了 orz巨佬好強

題意:每個點有三種顏色 黑白灰 現在要求把這棵樹變成一些滿足以下要求的樹 只有白點或者只有乙個白點 黑點無所謂 求問將給定的圖變成如上要求的最小代價 代價是每次可以斷邊權

那麼設dp[x][i][j]表示當前節點在x號且x為根 有i個黑色j個白色的其他子樹或者其他樹都滿足條件的最小代價是多少 那麼不妨先以1當根 然後樹形dp下 既然我的定義是以x為根 為什麼樹形dp也okay 因為最後我要求的是整張圖滿足條件即可 並沒有說誰要做根 那麼x節點上下幾條邊都可以斷那不就okay 做轉移的時候我枚舉子樹再列舉我當前節點的狀態 (黑點數&白點數) 對於黑點》1的情況我直接累加在1上 對於白點》2的情況 我直接累加在2上 然後再枚舉子樹的狀態(黑點數&白點數) 然後判斷 轉移到我現在來 要麼我現在的黑點數&白點數是我+子樹的 或者斷開和子樹的邊 黑點數&白點數就是我自己的 比較下即可

#include

#include

#include

#define n 330000

#define inf 1ll<<60

using

namespace

std;

inline

char gc()

return *s++;

}inline

int read()

struct nodedata[n<<1];

int fa[n],n,a[n],h[n],num,t;long

long dp[n][2][3],tmp[2][3];

inline

void insert1(int x,int y,int z)

inline

void dfs(int x)memcpy(dp[x],tmp,sizeof(tmp));

}}int main()

dfs(1);long

long ans=inf;

for (int i=0;i<=1;++i) for (int j=0;j<=2;++j) if (!i||j<2) ans=min(ans,dp[1][i][j]);

printf("%lld\n",ans);

}return

0;}

BZOJ 3257 樹的難題

3257 樹的難題 time limit 10 sec memory limit 128 mb submit 56 solved 39 submit status discuss description 給出乙個無根樹。樹有n個點,邊有權值。每個點都有顏色,是黑色 白色 灰色這三種顏色之一,稱為一棵...

BZOJ3257 樹的難題

設 f x i j 表示以 x 為根的子樹,與 x 連通部分有 i 個黑點,j 個白點,不聯通部分都是均衡的最小代價。若 i 1 則視作 1 若 j 2 則視作 2 然後進行樹形dp即可,轉移的時候如果不要那棵子樹,那麼那棵子樹的狀態必須滿足 i j 2 時間複雜度 o n include defi...

1900 985的「樹」難題

time limit 1 sec memory limit 128 mb 985給你一棵 樹 以及它的根節點,要求你先判定它是否是一棵樹,其次他想知道每個節點的 太子 數目以及它的父親 root的話輸出自己 太子判定條件 一 若x是y的孩子節點,那麼x是y的 太子 二 若x是y的 太子 且y是z的 ...