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 想讓她的奶牛準備郡級跳躍比賽,貝茜和她的夥伴們正在練習跨欄。她們...