HDU 3899 求所有人移动到某点的最小距离和 树形dp
2014-05-01 18:24
429 查看
题意:
给定n个点
每个点的人数
n-1条边和边权。
选取任意一点u,然后让所有人都移动到u点
问最小的移动距离和是多少
水dp
给定n个点
每个点的人数
n-1条边和边权。
选取任意一点u,然后让所有人都移动到u点
问最小的移动距离和是多少
水dp
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<queue> #include<string.h> #include<algorithm> #include<iostream> #include<vector> using namespace std; #define mod 112233 #define N 100030 #define ll __int64 struct Edge{ ll from, to, nex, dis; }edge[N*2]; ll head , edgenum; void add(ll u, ll v, ll dis){ Edge E={u,v,head[u],dis}; edge[edgenum] = E; head[u] = edgenum++; } ll n; ll dp , siz ; //i的子树到i的花费, siz[i]为i子树下队伍数量 ll T , all; void dfs(ll u, ll fa){ dp[u] = 0; siz[u] = T[u]; for(ll i = head[u]; ~i; i = edge[i].nex) { ll v = edge[i].to; if(v==fa)continue; dfs(v,u); dp[u] += siz[v]*edge[i].dis + dp[v]; siz[u] += siz[v]; } } ll hehe ;//i点的花费 void doubi(ll u, ll fa){ for(ll i = head[u]; ~i; i = edge[i].nex){ ll v = edge[i].to; if(v==fa)continue; ll dis = edge[i].dis; hehe[v] = hehe[u] - siz[v]*dis + (all-siz[v])*dis; doubi(v,u); } } ll ans; void init(){memset(head, -1, sizeof head); edgenum = 0 ;} int main(){ ll i, j, u, v, d; while(~scanf("%I64d",&n)){ init(); all = 0; for(i = 1; i <= n; i++)scanf("%I64d",&T[i]), all+=T[i]; for(i = 1; i < n; i++){ scanf("%I64d %I64d %I64d",&u,&v,&d); add(u,v,d); add(v,u,d); } dfs(1,1); ans = dp[1]; hehe[1] = dp[1]; doubi(1,1); for(i=2;i<=n;i++)ans = min(ans, hehe[i]); printf("%I64d\n",ans); } return 0; }
相关文章推荐
- hdu 3899(树形dp)
- hdu 3452 最小割 树形dp
- HDU 2376 树形dp|树上任意两点距离和的平均值
- HDU 4756:Install Air Conditioning (最小生成树最佳替换边,最小生成树+树形dp)
- HDU 3452 最小割 (树形dp)
- HDU 4003 Find Metal Mineral(树形dp,从根节点出发k个机器人遍历所有边的最小代价和)
- hdu 1054 最小点集覆盖 || 树形dp
- hdu 3899(树形dp)
- HDU 4126 Genghis Khan the Conqueror(树形dp,MST,破坏原有最小生成树边后的最小生成树代价)
- HDU - 4756 Install Air Conditioning(树形DP + 最小生成树)
- hdu 3899 树形dp 这个题目貌似不难,可是好像托了很久
- HDU 2196 Computer (树形DP 求树上每个点能到达的最远距离)
- hdu 2196 Computer 树形DP 求每个点的最远点距离 两次dfs的经典树形dp
- Hdu 6178 Monkeys【树形Dp-最小点覆盖+贪心思维】
- hdu 4081 最小生成树+树形dp
- HDU 3899 树形DP
- hdu 4003 Find Metal Mineral K个机器人从S出发遍历树上所有点的经过的最小权值 树形DP
- E - Strategic Game (HDU - 1054 )(最小顶点覆盖)(匈牙利算法模板)(树形DP)
- hdu1054 二分图最小点覆盖与树形dp解法
- HDU 3899 JLUCPC (树形DP)