日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP

發布時間:2023/12/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[Usaco2010 Mar]gather 奶牛大集會

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號沒有奶牛居住。?

?

分析:

  先以1(隨便)為根dfs一次,求出以每個節點為根時,他所在的子樹的人數個數sz,并且計算出以1為根時的不方便度。

  第二次時,繼續以1為根,這時假設當前節點為x,不方便度為cost,兒子節點為y。把x的不方便度cost向y轉化,其實就是

cost+(sz[1]-2*sz[y])*edge[i].cost (畫個圖就知道了。。。)

?

#include <set> #include <map> #include <list> #include <cmath> #include <queue> #include <stack> #include <string> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;typedef long long ll; typedef unsigned long long ull;#define debug puts("here") #define rep(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define REP(i,a,b) for(int i=a;i<=b;i++) #define foreach(i,vec) for(unsigned i=0;i<vec.size();i++) #define pb push_back #define RD(n) scanf("%d",&n) #define RD2(x,y) scanf("%d%d",&x,&y) #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) #define All(vec) vec.begin(),vec.end() #define MP make_pair #define PII pair<int,int> #define PQ priority_queue #define cmax(x,y) x = max(x,y) #define cmin(x,y) x = min(x,y) #define Clear(x) memset(x,0,sizeof(x)) /*#pragma comment(linker, "/STACK:1024000000,1024000000")int size = 256 << 20; // 256MB char *p = (char*)malloc(size) + size; __asm__("movl %0, %%esp\n" :: "r"(p) );*//******** program ********************/const int MAXN = 1e5+5; const ll INF = 1e15;struct Edge{int y,cost,next; }edge[MAXN<<1];int c[MAXN],n; ll dp[MAXN],sz[MAXN],ans[MAXN]; int po[MAXN],tol;inline void add(int x,int y,int cost){edge[++tol].y = y;edge[tol].cost = cost;edge[tol].next = po[x];po[x] = tol; }void dfsDp(int x,int fa){dp[x] = 0;sz[x] = c[x];for(int i=po[x];i;i=edge[i].next){int y = edge[i].y;if(y==fa)continue;dfsDp(y,x);sz[x] += sz[y];dp[x] += sz[y]*edge[i].cost+dp[y];} }void dfsAns(int x,int fa,ll cost){ans[x] = cost;for(int i=po[x];i;i=edge[i].next){int y = edge[i].y;if(y==fa)continue;ll tmp = cost+(sz[1]-2*sz[y])*edge[i].cost;dfsAns(y,x,tmp);} }int main(){#ifndef ONLINE_JUDGEfreopen("sum.in","r",stdin);//freopen("sum.out","w",stdout); #endifwhile(~RD(n)){rep1(i,n)RD(c[i]);int x,y,cost;REP(i,2,n){RD3(x,y,cost);add(x,y,cost);add(y,x,cost);}dfsDp(1,0);dfsAns(1,0,dp[1]);ll tmp = INF;rep1(i,n)cmin(tmp,ans[i]);cout<<tmp<<endl;}return 0; }

  

?

?

轉載于:https://www.cnblogs.com/yejinru/p/3295971.html

總結

以上是生活随笔為你收集整理的BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。