话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观。镇海中学共有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-景点中心(树的带权重心)的更多相关文章

  1. HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...

  2. 动态规划——树形dp

    动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...

  3. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  4. NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

  5. HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  6. CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树

    http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...

  7. bzoj 2286(虚树+树形dp) 虚树模板

    树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 5002  Sol ...

  8. 刷题总结——Tree chain problem(HDU 5293 树形dp+dfs序+树状数组)

    题目: Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There ar ...

  9. UOJ#290. 【ZJOI2017】仙人掌 仙人掌,Tarjan,计数,动态规划,树形dp,递推

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. ...

  10. Codeforces 671D Roads in Yusland [树形DP,线段树合并]

    洛谷 Codeforces 这是一个非正解,被正解暴踩,但它还是过了. 思路 首先很容易想到DP. 设\(dp_{x,i}\)表示\(x\)子树全部被覆盖,而且向上恰好延伸到\(dep=i\)的位置, ...

随机推荐

  1. 将通过<input type="file">上传的txt文件存储在localStorage,提取并构建File对象

    参考博文: JS 之Blob 对象类型 在本地存储localStorage中保存图片和文件 <input type="file" id="jobData" ...

  2. golang type

    参考链接 https://blog.csdn.net/tzs919/article/details/53571632 type是golang中非常重要的关键字,常见的就是定义结构体,但是其功能远不止是 ...

  3. react 组件构建设计

    项目设计中,可以从顶层React元素开始,然后实现它的子组件,自顶向下来构建组件的层级组件的写法:1.引入依赖模块2.定义React组件3.作为模块导出React组件4.子组件更新父组件的机制5.父组 ...

  4. cropper.js 超级好用的裁剪图片工具

    最近要做一个照片裁剪功能.就选用了cropper.js 代码如下:贴出来 <div class="container"> <div class="row ...

  5. 简单复利计算c语言实现

    #include<stdio.h>#include<math.h>float i; //利率 float p; //期初金额 float F; //未来值 int n; //期 ...

  6. 微信小程序wx:for和wx:for-item的正确用法

    wx:for="{{list}}"用来循环数组,而list即为数组名wx:for-item="items" 即用来定义一个循环过程中每个元素的变量的 如果是一维 ...

  7. 笔记之分布式文件系统(DFS)

    不知何故,老外都挺喜欢使用DFS,但是国内公司用这个的不多.一个具体的需求就是,备份服务器在国外,所以启用DFS把国内的数据同步一份到国外进行备份.最近有机会接触DFS,把一些心得体会记录一下. 1. ...

  8. 微信小程序 功能函数 客服

    <view> <view class='btn-img'> <image class='image-full' src='../../imgs/index/tab6.pn ...

  9. Docker跟一般的虚拟机有什么区别

    这是StackOverflow上的一个问题及其回答的翻译(原文:Docker.io跟一般的虚拟机有什么区别?).原文主要回答了三个问题: 1. Docker.io的基本原理是什么?2. 为什么在doc ...

  10. 洛谷 P3205 [HNOI2010]合唱队 解题报告

    P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...