动态规划:树形DP-景点中心(树的带权重心)
话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观。镇海中学共有n个景点,每个景点均有若干学生正在参 观。这n个景点以自然数1至n编号,每两个景点的编号均不同。每两个景点之间有且只有一条路径。选择哪个景点集中所有的学生,才能使所有学生走过的路径之和最小呢?
输入描述:
第一行只有一个正整数n,表示景点数。
第二行有n个1至1000间的整数,这n个整数间互相以一个空格分隔。其中第i个整数表示第i个景点处的学生数。
第三行至第n+1,每行有三个整数i,j,k,表示景点i和景点j之间有一条长为k的路径直接连接。其中i<>j,1≤i≤n, 1≤j≤n;1≤k≤1000。
输出描述:
有二行:
第一行只有一个整数i,表示在第i个景点处集中时,所有学生走过的路之和最短。
第二行也只有一个整数,表示所有学生走过的路径之和的最小值
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,num[],a,b,c,g[],tot,cnt,poi;//poi为最优点
long long ans[],minn=,siz[];//siz[i]以i为根节点的树的点权和,minn为最优答案,ans[i]为以i为根时的答案
struct s1
{int t,next;
long long l;
} e[];//e是边的相关信息,t是重点,next是下一条边,l是边权
void addedge(int s,int t,int l)//建图
{e[++tot].next=g[s];
g[s]=tot;
e[tot].t=t;
e[tot].l=l;
return;
}
void geta(int x,int d,int f)//预处理:随便找个点(这里是1)作为根节点遍历整棵树,计算以这个点为根时的siz和ans
{siz[x]=num[x];
for(int i=g[x];i!=;i=e[i].next)
if(e[i].t!=f)//因为最初是双向建边,所以这里应注意不需要重复处理。又因为树上没有环,所以别再去找父节点就行
{geta(e[i].t,d+e[i].l,x);
siz[x]+=siz[e[i].t];
ans[]+=siz[e[i].t]*e[i].l;
}
return;
}
void dp(int x,int f)
{if(ans[x]<minn)//到达每个点时ans必然是已经算好的,所以先更新minn和poi
{minn=ans[x];
poi=x;
}
for(int i=g[x];i!=;i=e[i].next)//计算好子节点的ans之后再将阶段转移到子节点,以继续计算其他的ans
if(e[i].t!=f)//同样不需要重复处理
{ans[e[i].t]=ans[x]+e[i].l*(cnt-*siz[e[i].t]);//由ans[e[i].t]=ans[x]+(cnt-siz[e[i].t])*e[i].l-siz[e[i].t]*e[i].l化简而来,即以e[i].t为根的子树上的点不需要再经过第i条边,其他点需要经过第i条边
dp(e[i].t,x);
}
return;
}
int main()
{freopen("p1487.in","r",stdin);
freopen("p1487.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;++i)
{scanf("%d",&num[i]);
cnt+=num[i];
}
for(int i=;i<n;++i)
{scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);//注意双向建边
addedge(b,a,c);
}
geta(,,);
dp(,);
cout<<poi<<endl<<minn<<endl;
return ;
}
动态规划:树形DP-景点中心(树的带权重心)的更多相关文章
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
- 动态规划——树形dp
动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树
http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...
- bzoj 2286(虚树+树形dp) 虚树模板
树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5002 Sol ...
- 刷题总结——Tree chain problem(HDU 5293 树形dp+dfs序+树状数组)
题目: Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There ar ...
- UOJ#290. 【ZJOI2017】仙人掌 仙人掌,Tarjan,计数,动态规划,树形dp,递推
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. ...
- Codeforces 671D Roads in Yusland [树形DP,线段树合并]
洛谷 Codeforces 这是一个非正解,被正解暴踩,但它还是过了. 思路 首先很容易想到DP. 设\(dp_{x,i}\)表示\(x\)子树全部被覆盖,而且向上恰好延伸到\(dep=i\)的位置, ...
随机推荐
- 【Coursera】经验风险最小化
一.经验风险最小化 1.有限假设类情形 对于Chernoff bound 不等式,最直观的解释就是利用高斯分布的图象.而且这个结论和中心极限定律没有关系,当m为任意值时Chernoff bound均成 ...
- 【搜索】POJ-3669 BFS
一.题目 Description Bessie hears that an extraordinary meteor shower is coming; reports say that these ...
- Software Defined Networking(Week 3, part 1)
Control and Data Plane Seperation 课程地址 Overview 今天正式地学习一个控制与数据平面分离.学习完本节,应该要掌握何为控制和数据平面,了解它们的功能以及好处, ...
- Internet History, Technology and Security (Week7)
Week7 With reliable "pipes" available from the Transport layer, we can build applications ...
- Enterprise Library 5.0 参考源码索引
http://www.projky.com/entlib/5.0/Microsoft/Practices/EnterpriseLibrary/Caching/BackgroundScheduler.c ...
- Internet History, Technology and Security (Week 6)
Week 6 Technology: Transport Control Protocol (TCP) Welcome to Week 6 of IHTS. We are in our second ...
- java static{}块
java中static{}块只有在类加载是才会被调用. 这说明:static只有可能被调用一次. 原因:首先理解什么是类加载,区分类加载和申明对象的区别. public class StaticTes ...
- linux下tomcat、jenkins环境搭建
1.安装JDK 我不列出来了,自行百度 java -version 2.安装tomcat (1)将下载的tomcat压缩包 tar -zxvf apache-tomcat-8.5.29.tar.gz ...
- 如何规范 CSS 的命名和书写
我开始学前端的时候也是对于规范问题头疼,后来看了网易的NEC规范,惊呼牛逼 NEC : 更好的CSS样式解决方案 只遵循横向顺序即可,先显示定位布局类属性,后盒模型等自身属性,最后是文本类及修饰类属性 ...
- 关于 Source Engine 2007 网络通信的分析
最近在写自己的游戏引擎,主要是参考Quake和GoldSrc和SourceEngine2007,其中SourceEngine2007代码比较新一些. 对比了这几个引擎的代码,前两者代码比较简单,基于C ...