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的 ...