Description

话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观。镇海中学共有n个景点,每个景点均有若干学生正在参观。这n个景点以自然数1至n编号,每两个景点的编号均不同。每两个景点之间有且只有一条路径。选择哪个景点集中的学生,才能使所有学生走过的路径之和最小呢?

如果存在多个解,则输出距离1最近的那个点,可以证明答案唯一

Input

输入文件center.in中有若干行:

第一行只有一个正整数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。

Output

输出文件center.out中有二行;

第一行只有一个整数i,表示在第i个景点处集中时,所有学生走过的路径之和最短。

第二行也只有一个整数,表示所有学生走过的路径之和的最小值。

Data Constraint

所有的数据均随机生成,且满足:

30%的数据,1≤n≤200。

60%的数据,1≤n≤3000。

100%的数据,1≤n≤100000。

Solution

这题我没想到什么好的方法,主要是靠树形DP推出每个点为集中点时的代价。

首先,我们需要一个初始值,所以我们先暴力将1为集合点时的代价给求出来。

然后我们处理它的子节点





不难发现,子节点与原根节点的连边是条很重要的边

以该子节点为根的子树的每一个节点到集中点的贡献都减少了该边长度,而其他的边都增加了该边长度

所以我们就可以先在第一次暴力求答案的时候先求出几个重要的数

首先我们设tree[i]表示以i为根的子树的学生数

设f[i]表示该点到集中点的贡献

一开始我们求出了f[1],而其他的点都可以推出来,最后求个最小值即可

Code

#include <cstdio>
#define ll long long
using namespace std;
int len,n,a,b,c,i,ans,go[1000001],to[1000001],last[1000001],w[1000001],tree[1000001],m[1000001];
ll f[1000001];
void make(int x,int y,int z)
{
go[++len]=y;to[len]=last[x];w[len]=z;last[x]=len;
}
void dg(int x,int fa,ll s1)
{
int k=last[x];
tree[x]=m[x];
f[x]=m[x]*s1;
while (k)
{
if (go[k]!=fa)
{
dg(go[k],x,s1+w[k]);
tree[x]+=tree[go[k]];
f[x]+=f[go[k]];
}
k=to[k];
}
}
void dfs(int x,int fa,ll s)
{
if (x!=1)
{
f[x]=f[fa]+(tree[1]-tree[x])*s-tree[x]*s;
if (f[x]<f[ans]) ans=x;
}
int k=last[x];
while (k)
{
if (go[k]!=fa) dfs(go[k],x,w[k]);
k=to[k];
}
}
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&m[i]);
}
for (i=1;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
make(a,b,c);make(b,a,c);
}
dg(1,0,0);
ans=1;
dfs(1,0,0);
printf("%d\n%lld",ans,f[ans]);
}

jzoj1497. 景点中心的更多相关文章

  1. JZOJ2020年8月11日提高组T4 景点中心

    JZOJ2020年8月11日提高组T4 景点中心 题目 Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个 ...

  2. 天气预报API(二):全球城市、景点代码列表(“旧编码”)

    说明 2016-12-10 补充 (后来)偶然发现中国天气网已经有城市ID列表的网页...还发现城市编码有两种,暂且称中国天气网这些编码为旧标准"旧编码"的特征是 9个字符长度; ...

  3. 动态规划:树形DP

    典型例题有三道: 没有上司的舞会 选课 景点中心 我们可以把动态规划的状态和转移描述成DAG 对于有根树来说,如果我们规定边的方向由父节点指向叶子节点 或者是由叶子节点指向父节点(奇葩) 那么它也是一 ...

  4. 旅游景点信息API接口大全

    1.分享数据:“http://www.shareapi.cn/docs/api/id/127”,免费,次数1000次 返回JSON示例 { "SceneryID":10224,/* ...

  5. .net 分布式架构之配置中心

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ConfigManager ...

  6. Consul-template的简单应用:配置中心,服务发现与健康监测

    简介 Consul-template是Consul的一个方扩展工具,通过监听Consul中的数据可以动态修改一些配置文件,大家比较热衷于应用在Nginx,HAProxy上动态配置健康状态下的客户端反向 ...

  7. BPM流程中心解决方案分享

    一.需求分析 在过去办公自动化的浪潮中,很多企业已经实施了OA流程,但随着客户的发展和对流程管理的越来越重视, 客户对流程应用需求越来越深 入,您可能面临以下需求: 1.流程功能不能满足需求,包括流程 ...

  8. IM 去中心化概念模型与架构设计

    今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的. 站在这个角度而言,实际上并非所有的业务都能做去中 ...

  9. Android 手机卫士3--设置中心

    1.要点击九宫格中的条目,需要注册点击事件 // 注册九宫格单个条目的点击事件 gv_home.setOnItemClickListener(new OnItemClickListener() { / ...

随机推荐

  1. 你知道MySQL是如何处理千万级数据的吗?

    mysql 分表思路 一张一亿的订单表,可以分成五张表,这样每张表就只有两千万数据,分担了原来一张表的压力,分表需要根据某个条件进行分,这里可以根据地区来分表,需要一个中间件来控制到底是去哪张表去找到 ...

  2. C#设计模式之0-简单工厂模式

    简单工厂模式(Simple Factory Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/387 访问 ...

  3. C#LeetCode刷题-双指针

    双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.5% 中等 11 盛最多水的容器   43.5% 中等 15 三数之和   16.1% 中等 16 最接近的三数之和   3 ...

  4. cocos2dx重新设置 SDK NDK目录

    参考博客https://blog.csdn.net/yinhe888675/article/details/41042347 初始设置SDK,NDK目录后,当我想换目录的时候不知道该怎么办,怎么重新设 ...

  5. 简述python中`functools.wrapper()

    简述python中functools.wrapper() 首先对于最简单的函数: def a(): pass if __name__ == '__main__': print(a.__name__) ...

  6. 金题大战Vol.0 C、树上的等差数列

    金题大战Vol.0 C.树上的等差数列 题目描述 给定一棵包含\(N\)个节点的无根树,节点编号\(1-N\).其中每个节点都具有一个权值,第\(i\)个节点的权值是\(A_i\). 小\(Hi\)希 ...

  7. 当Notification和Websocket遇到https、http

    @ 目录 一.http转为https请求 (1)生成证书1(crt证书转tomcat使用的jks) (2)配置证书1 (3)生成证书2 (4)配置证书2 二.Websocket改为https连接 后言 ...

  8. antd-vue的select组件实现既可以输入添加,又可以下拉选择

    最近,项目中碰到需求,要求任务类型可以从下拉框(后台返回的数据)中选择,也可以手动输入添加新项,项目用的是antd-vue,所以最接近的组件就是a-select组件了,废话不多说,改造方法如下: HT ...

  9. docker简记

    title: docker学习简记 date: 2019-10-16 15:10:39 tags: docker Docker简记 1:Docker简介 1)出现背景 一款产品从开发到上线,从操作系统 ...

  10. Java之Annotation(注解)——注解处理器

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...