給你一棵n個結點的樹,每一個結點有一個權值,刪除一條邊的費用爲該邊鏈接的兩個子樹中結點權值最大值之和。現要刪除樹中的全部邊,刪除邊的順序能夠任意設定,請計算出全部方案中的最小花費。spa
輸入文件名爲 delete.in。
第一行包含整數n,表示結點數。結點用從1到n表示。
第二行包含n個整數ti(1≤ti≤109)。數字ti表示結點i的權值。
接下來n−1行,每行包含兩個整數x和y(1≤x,y≤n),表示結點x和結點y直接相連。code
輸出文件名爲 delete.out。
輸出最小花費。string
題目大意:有一棵樹,刪去一條邊的代價是這條邊兩端子樹裏各自權值最大值之和,安排刪邊順序使得代價最小,輸出最小代價
一道結論題,沒什麼好說的
\(ans=\sum t_{i}-\max \left\{t_{i}\right\}+\sum \max \left(t_{x_{i}}, t_{y_{i}}\right)\)
證實自行思考it
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll n,x,y,ans,mx,c[100001]; int main() { freopen("delete.in","r",stdin); freopen("delete.out","w",stdout); scanf("%lld",&n); for (int i=1;i<=n;++i) scanf("%lld",&c[i]),ans+=c[i],mx=max(mx,c[i]); for (int i=1;i<n;++i) { scanf("%lld%lld",&x,&y); ans+=max(c[x],c[y]); } printf("%lld\n",ans-mx); fclose(stdin); fclose(stdout); return 0; }