樹形dp Jzoj P3347 樹的難題

2022-07-24 05:36:09 字數 1494 閱讀 4501

description

input

輸入檔案 為split.in 。

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

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

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

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

output

輸出檔案為 split.out 。

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

sample input

1

50 1 1 1 0

1 2 5

1 3 3

5 2 5

2 4 16

sample output

10

【樣例解釋】

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

data constraint

對於 10% 的資料: 1 ≤ n ≤ 10。

對於 30% 的資料: 1 ≤ n ≤ 50 0。

對於 60% 的資料: 1 ≤ n ≤ 50 000 。

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

1 #include 2 #include 3 #include 4

#define min(a,b) (a5

#define mem(a,b) memset(a,b,sizeof(a))

6#define ll long long

7#define fb(i,x) for(i=head[x];i;i=nex[i])

8#define fo(i,a,b) for(i=a;i<=b;i++)

9using

namespace

std;

10const ll n=3e5+10,inf=1e9*n;

11ll n,x,y,tail,cnt,ans,t,head[n],col[n],f[n],g[n],h[n],q[n],cur[n],sum[n],fa[n];

12struct edge e[n*2

];13

void

insert(ll x,ll y,ll z)

1418

void

dfs()

1930 fa[y]=e[cur[x]].v,q[++tail]=y,cur[y]=head[y],cur[x]=e[cur[x]].from;31

if (!col[y]) f[y]=inf;

32if (col[y]==1) g[y]=inf;33}

34else

3542}43

}44intmain()

4554 }

樹形dp Jzoj P1162 貪吃的九頭龍

description 傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫 九頭龍 但這只是說它出生的時候有九個頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。有一天,有m個腦袋的九頭龍看到一棵長有n個果子的果樹,喜出望外,恨不得一口把它全部吃掉。可是必...

樹形dp 樹的重心

1.只需要求出最大子樹中節點數最小的數目即可 題意 有乙個國王要把他的領土分給兩個兒子,國王的領土是一棵樹,n個結點,n 1條邊把這些結點連起來,現在大小兒子要選擇乙個點作為他的首都,那麼除首都分別是這兩個兒子之外,其他的城市 結點 根據離誰近就歸誰所有,如果一樣遠的話就歸大兒子所有,現在假設兩個人...

2334 樹的直徑(樹形DP)

原博主部落格 還有廣搜的寫法 描述 樹的直徑,即這棵樹中距離最遠的兩個結點的距離。每兩個相鄰的結點的距離為1,即父親結點與兒子結點或兒子結點與父子結點之間的距離為1.有趣的是,從樹的任意乙個結點a出發,走到距離最遠的結點b,再從結點b出發,能夠走的最遠距離,就是樹的直徑。樹中相鄰兩個結點的距離為1。...