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
150 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。...