jzoj1497. 景点中心
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. 景点中心的更多相关文章
- JZOJ2020年8月11日提高组T4 景点中心
JZOJ2020年8月11日提高组T4 景点中心 题目 Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个 ...
- 天气预报API(二):全球城市、景点代码列表(“旧编码”)
说明 2016-12-10 补充 (后来)偶然发现中国天气网已经有城市ID列表的网页...还发现城市编码有两种,暂且称中国天气网这些编码为旧标准"旧编码"的特征是 9个字符长度; ...
- 动态规划:树形DP
典型例题有三道: 没有上司的舞会 选课 景点中心 我们可以把动态规划的状态和转移描述成DAG 对于有根树来说,如果我们规定边的方向由父节点指向叶子节点 或者是由叶子节点指向父节点(奇葩) 那么它也是一 ...
- 旅游景点信息API接口大全
1.分享数据:“http://www.shareapi.cn/docs/api/id/127”,免费,次数1000次 返回JSON示例 { "SceneryID":10224,/* ...
- .net 分布式架构之配置中心
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ConfigManager ...
- Consul-template的简单应用:配置中心,服务发现与健康监测
简介 Consul-template是Consul的一个方扩展工具,通过监听Consul中的数据可以动态修改一些配置文件,大家比较热衷于应用在Nginx,HAProxy上动态配置健康状态下的客户端反向 ...
- BPM流程中心解决方案分享
一.需求分析 在过去办公自动化的浪潮中,很多企业已经实施了OA流程,但随着客户的发展和对流程管理的越来越重视, 客户对流程应用需求越来越深 入,您可能面临以下需求: 1.流程功能不能满足需求,包括流程 ...
- IM 去中心化概念模型与架构设计
今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的. 站在这个角度而言,实际上并非所有的业务都能做去中 ...
- Android 手机卫士3--设置中心
1.要点击九宫格中的条目,需要注册点击事件 // 注册九宫格单个条目的点击事件 gv_home.setOnItemClickListener(new OnItemClickListener() { / ...
随机推荐
- C#LeetCode刷题-拒绝采样
拒绝采样篇 # 题名 通过率 难度 470 用 Rand7() 实现 Rand10() 34.4% 中等 478 在圆内随机生成点 22.8% 中等
- C#LeetCode刷题-动态规划
动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% ...
- C#LeetCode刷题之#697-数组的度( Degree of an Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3738 访问. 给定一个非空且只包含非负数的整数数组 nums, ...
- Linux系统安装Nginx(Centos7)
Nginx是一款轻量级的网页服务器.反向代理服务器.它最常的用途是提供反向代理服务,还可以做负载均衡.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.服务端很多场景都需要使用,这篇 ...
- 针对VM从挂机-启动后,docker相关服务的无法使用问题!
使用软件 :VMware WorkStation 使用系统:linux centOS 7 windows远程调用软件:xshell 挂机-启动状态后 先使用 service network re ...
- java.util.Scanner中hasNext()方法和next()方法的区别
先说结论: 两者均根据空格划分数据 两者在没有数据输入时均会等待输入 next()方法会将空格划分的数据依次输出,运行一次,输出一个 hasNext()方法会跟着next()方法移动,当前数据不为空, ...
- Aspnet Zero中使用Windows service (Topshelf)来承载Quartz.net任务
Aspnet Zero使用Windows service (Topshelf)来承载Quartz.net任务 网上有很多关于如何使用Topshelf创建ABP的Quartz windows服务,但很少 ...
- 初始化vtable
在InstanceKlass::link_class_impl()方法中完成方法连接后会继续初始化vtable与itable,之前已经介绍过vtable与itable,并且在类解析过程中已经完成了大小 ...
- Java引用类型之软引用(2)
下面接着上一篇介绍第2阶段和第3阶段的处理逻辑. 2.process_phase2() 第2个阶段移除所有的referent还存活的Reference,也就是从refs_list中移除Referenc ...
- windows 服务端 狼人杀 发牌器 开发完成 待继续开发其他服务
开发工具: python2.7 eric4 成果链接地址 https://wws.lanzous.com/iPCDTfnuoif