BZOJ1827 奶牛大集會(樹形遞推)

2021-07-28 11:38:09 字數 1565 閱讀 2153

description

bessie正在計畫一年一度的奶牛大集會,來自全國各地的奶牛將來參加這一次集會。當然,她會選擇最方便的地點來舉辦這次集會。每個奶牛居住在 n(1<=n<=100,000) 個農場中的乙個,這些農場由n-1條道路連線,並且從任意乙個農場都能夠到達另外乙個農場。道路i連線農場a_i和b_i(1 <= a_i <=n; 1 <= b_i <= n),長度為l_i(1 <= l_i <= 1,000)。集會可以在n個農場中的任意乙個舉行。另外,每個牛棚中居住者c_i(0 <= c_i <= 1,000)只奶牛。在選擇集會的地點的時候,bessie希望最大化方便的程度(也就是最小化不方便程度)。比如選擇第x個農場作為集會地點,它的不方便程度是其它牛棚中每只奶牛去參加集會所走的路程之和,(比如,農場i到達農場x的距離是20,那麼總路程就是c_i*20)。幫助bessie找出最方便的地點來舉行大集會。 考慮乙個由五個農場組成的國家,分別由長度各異的道路連線起來。在所有農場中,3號和4號沒有奶牛居住。

第一行:乙個整數n * 第二到n+1行:第i+1行有乙個整數c_i * 第n+2行到2*n行,第i+n+1行為3個整數:a_i,b_i和l_i。

output

乙個值,表示最小的不方便值。

sample input

1 3 1

2 3 2

3 4 3

4 5 3

sample output

題解:如果題目已經給定了集會的地點,那麼做一遍dfs就好了。我們發現:如果從當前的集會地點移動到它的任意乙個兒子,只會有兩個值發生變化,合起來變化量為(siz[root]-2*siz[son])*len[root][son],因此我們可令任意乙個節點為集會地點,先算一遍,再o(n)尋找解最優的地方就行了。

**如下:

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x7f7f7f7f

#define n 100005

using

namespace

std;

int n,val[n],x,y,z;

ll dis[n],siz[n],ans;

struct nod

nod(int a,int b,int c):v(a),w(b),nex(c){}

}e[n<<1];

int cnt,hd[n<<1];

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

ll dfs(int u,int fa)

return ans;

}void work(int u,int fa)

}}int main()

ans=dfs(1,0);

work(1,0);

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

return

0;}

BZOJ1827 奶牛大集會

題意 找乙個點x使得 sum c i cdot dis i,x 最小 其中dis表示i x的距離 做法 先跑出乙個點的答案,然後在樹上跳動,x son的時候son這棵子樹的答案都減去 sum c i dis x,son i in son 其他節點都增加 sum c i dis x,son inclu...

0717 樹形dp 容斥原理 BZOJ1827

由於是許可權題,我就不好把題目發上來了 萬一bzoj打我怎麼辦 題目大意如下即可 題解 30 資料,暴力計算 列舉每個點作為集合點,然後計算。兩點距離可以用 lca 來計算 對於100 資料 考慮 樹形dp 容斥原理 換根 定義f i 表示i為關鍵點答案 dis i 表示以i為根子樹和,第一遍樹形d...

BZOJ1641Cow Hurdles 奶牛跨欄

1641 usaco2007 nov cow hurdles 奶牛跨欄 time limit 5 sec memory limit 64 mb submit 511 solved 336 description farmer john 想讓她的奶牛準備郡級跳躍比賽,貝茜和她的夥伴們正在練習跨欄。她們...