[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相关推荐

  1. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心

    Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,0 ...

  2. bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】

    不能用read会TLE!!不能用read会TLE!!不能用read会TLE!! 一开始以为要维护每个点,线段树写了好长(还T了-- 首先dfs一遍,求出点1为集会地点的答案,处理处val[u]为以1为 ...

  3. [Usaco2010 Mar]gather 奶牛大集会

    1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1129  Solved: 525 [ ...

  4. bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声(单调栈)

    1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 848  Solved: 594 [Sub ...

  5. BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操

    [题意] 给出一棵树.现在可以在树中删去m条边,使它变成m+1棵树.要求最小化树的直径的最大值. [题解] 二分答案.$Check$的时候用$DP$,记录当前节点每个儿子的直径$v[i]$,如果$v[ ...

  6. BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争

    传送门 考虑构建网络流模型 把一个流量看成一只奶牛的攻击过程,那么答案就是最大流 因为每只奶牛只能操作一波,所以构造分层图,一层相当于一步 第一层就是初始状态,从 $S$ 向所有 $J$ 奶牛连一条流 ...

  7. BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交

    发现最终的结果只和$s1$,$s2$,$s3$之间的比例有关. 所以直接令$s3=1$ 然后就变成了两个变量,然后求一次半平面交. 对于每一个询问所属的直线,看看半平面在它的那一侧,或者相交就可以判断 ...

  8. bzoj 1617: [Usaco2008 Mar]River Crossing渡河问题(DP)

    1617: [Usaco2008 Mar]River Crossing渡河问题 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1077  Solved: ...

  9. bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

最新文章

  1. MIT自然语言处理第三讲:概率语言模型(第四、五、六部分)
  2. Ecplise中配置Tomcat7服务器
  3. SAP Spartacus user和org user form两处不同的checkbox风格
  4. Jmeter之性能测试类型
  5. @getMapping与@postMapping
  6. 大众CEO迪斯承认芯片仍短缺
  7. 2019云计算战局前瞻:百度云要啃“硬骨头”
  8. 啥时候js单元测试变的重要起来?
  9. [CareerCup] 12.6 Test an ATM 测试一个自动取款机
  10. 【FastReport教程】如何使用RichObject属性将文件导出为文本格式
  11. (2022最新)Java毕业设计参考题目-题目新颖(值得收藏)
  12. vivado使用入门
  13. 使用Wireshark抓包分析TCP协议
  14. 在html中做框架的页面,网页中的框架(详解)
  15. ClickHouse遇见RoaringBitmap
  16. 外显子名词解释_生物信息学常用名词解释(四)
  17. EOS代码架构及分析(四)
  18. python生成二维码_使用python生成二维码
  19. 关机时候计算机更新,电脑关机时提示更新,能否强制关机?
  20. android原生打印PDF,HTML;HTML转换为PDF

热门文章

  1. 两组的数据平均值合并_不要进入数据陷进
  2. android 通讯录 备份,安卓Android手机通讯录怎么备份 卓联系人备份 卓手机联系人导出...
  3. hdfs如何查找指定目录是否文件_hadoop实战教程-HDFS文件系统如何查看文件对应的block...
  4. c语言int32u的作用,求c语言大神 帮我解释一下这段说的都是啥?
  5. mysql 5.764_RHEL5.764位源码编译安装MySQL-5.5.42遇到的问题
  6. edge如何导入html文件收藏夹,edge浏览器收藏夹如何导入?edge浏览器收藏夹导入方法...
  7. linux添加启动脚本文件夹,linux – 将脚本中的符号链接添加到rc.d文件夹中以在系统启动期间启动进程...
  8. 最强阿里巴巴历年经典面试题汇总:C++研发岗
  9. 《Python Cookbook 3rd》笔记(4.3):使用生成器创建新的迭代模式
  10. 《Python Cookbook 3rd》笔记(1.9):查找两字典的相同点