5776. 【NOIP2008模拟】小x游世界树 
(File IO): input:yggdrasil.in output:yggdrasil.out

Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed Limits  

Goto ProblemSet

Description

小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了,不甘心的他将自己的目的地改成了世界树,他耗费了大量的时间,终于将自己传送到了世界树下。世界树是一棵非常巨大的树,它有着许许多多的枝条以及节点,每个节点上都有一个平台。好不容易来到传说中的世界树下,小x当然要爬上去看看风景。小x每经过一条边都会耗费体力值。然而世界树之主想给他弄(gáo)些(dǐan)麻(shì)烦(qíng),于是他在每条边上都设了一个魔法阵,当小x踏上那条边时会被传送回根节点,魔法阵只生效一次。这岂不是要累死小x?幸运的是,每个平台上都有无数个加速器,这些加速器可以让小x在当前节点所连的边上耗费的体力值减少,不同平台的加速器性能不一定相同,但同一个平台的加速器性能绝对相同。世界树之主给了小x一次“换根”的机会,他可以将世界树的任何一个节点变为根,但所有的边都不能改变。小x想问你,将根换为哪个节点能使小x爬到世界树上的每个节点耗费的体力值和最少。默认编号为1的点为初始根。

Input

第一行一个数n,表示有n个节点。
第二行n个数ai,表示每个平台上的加速器的性能。
第三至n+1行,每行三个数bi,ci,di分别表示这条无向边的起点,终点与耗费的能量值

Output

第一行一个数,表示要换成的节点,如果有多个点为根时耗费的体力值都最小,则输出编号最小的那个。如果保持为1是最优的,就输出1。
         第二行一个数,表示最小耗费的体力值。

Sample Input

4
2 1 3 3
1 2 3
1 3 4
2 4 6

Sample Output

1
9

Data Constraint

对于20%的数据:n<=100
对于40%的数据:n<=1000
对于60%的数据:n<=8000
对于80%的数据:n<=100000
对于100%的数据:0<n<=700000;ai<=1000;1<=bi,ci<=n;di<=1000。
数据保证一个点的加速器性能绝对小于等于它的所有的边所耗费的能量,保证所有节点都可以到达,保证没有数据与样例相同。

Hint

提示:
样例解释:
如果以第一个点为根,则需要耗费0(到1)+1(到2)+2(到3)+6(到4)=9的能量值。
如果以第二个点为根,则需要耗费2(到1)+0(到2)+4(到3)+5(到4)=11的能量值。
如果以第三个点为根,则需要耗费1(到1)+2(到2)+0(到3)+7(到4)=10的能量值。
如果以第四个点为根,则需要耗费5(到1)+3(到2)+7(到3)+0(到4)=15的能量值。
很明显以第一个点为根是最优的。

做法:其实并不是每个点都要建一次树,我们可以在一个点为整棵树的根节点时,以它的答案来更新它的儿子节点的答案,这样实际上只会涉及一条边贡献的改变。
代码如下:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #define LL long long
 5 #define N 1000007
 6 using namespace std;
 7 struct edge
 8 {
 9     LL to, next, w;
10 }e[N * 2];
11 LL zs[N], n, a[N], ls[N * 2], ans, root, site, cnt;
12 bool v[N];
13
14 void add(LL x, LL y, LL z)
15 {
16     e[++cnt].to = y;
17     e[cnt].next = ls[x];
18     e[cnt].w = z;
19     ls[x] = cnt;
20 }
21
22 void dfs(LL x, LL sum)
23 {
24     root += sum;
25     for (int i = ls[x]; i; i = e[i].next)
26     {
27         if (v[e[i].to])    continue;
28         v[e[i].to] = 1;
29         dfs(e[i].to, sum + (e[i].w - a[x]));
30         zs[x] += zs[e[i].to];
31     }
32     zs[x]++;
33 }
34
35 void find(LL x, LL sum)
36 {
37     if (sum < ans)
38     {
39         ans = sum;
40         site = x;
41     }
42     else if (sum == ans)    site = min(site, x);
43     for (int i = ls[x]; i; i = e[i].next)
44     {
45         if (v[e[i].to])    continue;
46         v[e[i].to] = 1;
47         find(e[i].to, sum + (n - zs[e[i].to]) * (e[i].w - a[e[i].to])- zs[e[i].to] * (e[i].w - a[x]));
48     }
49 }
50
51 int main()
52 {
53     freopen("yggdrasil.in", "r", stdin);
54     freopen("yggdrasil.out", "w", stdout);
55     scanf("%lld", &n);
56     for (int i = 1; i <= n; i++)
57         scanf("%lld", &a[i]);
58     for (int i = 1; i <= n - 1; i++)
59     {
60         LL x, y, z;
61         scanf("%lld%lld%lld", &x, &y, &z);
62         add(x, y, z);
63         add(y, x, z);
64     }
65     v[1] = 1;
66     dfs(1, 0);
67     ans = root;
68     site = 1;
69     memset(v, 0, sizeof(v));
70     v[1] = 1;
71     find(1, root);
72     printf("%lld\n", site);
73     printf("%lld", ans);
74 }

View Code

转载于:https://www.cnblogs.com/traveller-ly/p/9461936.html

JZOJ 5776. 【NOIP2008模拟】小x游世界树相关推荐

  1. JZOJ5776. 【NOIP2008模拟】小x游世界树

    题目:[NOIP2008模拟]小x游世界树: 题目的附加题解给的很清楚,这里只给一个代码: 1 #include<iostream> 2 #include<cstdio> 3 ...

  2. [2020-11-30 contest]数列(矩阵加速),秘密通道(dijkstra最短路)小X游世界树(换根dp),划分(数学)

    文章目录 数列 solution code 秘密通道 solution code 小X游世界树 solution code 划分 solution code 数列 a[1]=a[2]=a[3]=1 a ...

  3. [题解](树形dp/换根)小x游世界树

    2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...

  4. 【JZOJ 5776】【NOIP2008模拟】小x游世界树 (树)

    问题描述 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了, ...

  5. 梦幻模拟战 java,梦幻模拟战手游:抽SSR真的难!你抽到几个SSR英雄?

    原标题:梦幻模拟战手游:抽SSR真的难!你抽到几个SSR英雄? NB游戏,娱乐生活!大家好,我是NB.前段时间一直测试狐妖小红娘手游和航海王燃烧意志这两款手游,甚至是网易刚出的神都夜行录也去体验了一把 ...

  6. 梦幻模拟战手游怎么在电脑上玩 梦幻模拟战安卓模拟器玩法教程

    梦幻模拟战是上古三大日式RPG的巅峰之一,作为正统游戏续作将传承经典特色,还原游戏经典,在剧情上补充了游戏后续空白,同时进行内容创新.战棋式策略战斗让玩家感受到时代气息,游戏画面升级换代,战斗流程也更 ...

  7. 【DP】小明游天界(zjoj 2149)

    小明游天界 题目大意: 有 m个单位时间,让你从1走到n(不能早到,不能晚到),要使经过的城市最多,若无法用m个单位时间到达n就输出-1 样例输入 5 12 4 1 2 5 1 4 3 4 2 4 2 ...

  8. 梦幻模拟战手游服务器维护,梦幻模拟战手游11月21日更新公告 执行者降临限时召唤开启[多图]...

    梦幻模拟战手游11月21日更新内容中开启了限时十连抽必得SR英雄哦,同时还有时空的轨迹SC秘境新挑战,接下来跟随安族大大来看看详细资讯详情吧,希望各位能够喜欢~ 梦幻模拟战手游11月21日更新公告 服 ...

  9. Bootstrap框架: 模拟小风车科技官网

    插件地址:http://www.bootcss.com Bootstrap是一个简洁.直观.强悍的前端开发框架,让web开发更迅速.简单. 本次我们利用它来模拟小风车科技的官网,因为它的官网开发也是利 ...

最新文章

  1. 为.Net程序集添加资源
  2. c++中的左值与右值
  3. Docker基本组成 和 基本命令
  4. LeetCode MySQL 1747. 应该被禁止的Leetflex账户
  5. netty 游戏服务器框图_基于Netty和WebSocket协议实现Web端自动打印订单服务方法与流程...
  6. [Tips] WSL ubuntu 18.04 安装python3
  7. 【Elastischearch】Elastischearch 的 ID 生成器 UUIDGenerator
  8. 干货||Selenium自动化测试网页
  9. Hadoop的安装配置
  10. html音乐if代码如何使用,关于html:如何在带有JavaScript代码的if条件中使用函数方法?...
  11. 【遥感图像预处理方法】
  12. 线性表的链式存储结构(完整代码(C语言)+运行实例)
  13. 高速电路常用的信号完整性测试手段与仿真
  14. Spark实用议题系列(02)--- DataFrame的各种join总结和实例
  15. python编程长方形面积公式_求长方形面积-题解(Java代码)
  16. Android打开系统设置界面
  17. Python Scrapy 上传图片到FastDfs(py3fdfs)
  18. ChatGPT数据集之谜
  19. 萌新 学习python 途中一点疑惑记录IndexError: string index out of range
  20. AI:互联网程序设计竞赛之蓝桥杯大赛的简介、奖项设置、大赛内容以及蓝桥杯与ACM(ICPC)的四个维度对比之详细攻略

热门文章

  1. Oracle if else if for case
  2. Felix的Nodejs代码风格
  3. 字符串处理示例--列车车次查询.sql
  4. 看到一个暴强的翻译,闲的蛋疼,写个c#版的
  5. [Web 前端] 解决因inline-block元素导致的空白间距和元素下沉
  6. C++11 tuple的使用
  7. JavaScript中eval()函数
  8. [新功能]删除团队文章
  9. 数据链路层中的LLC
  10. java 判断数字变化增减_java String 强化操作 判断数字 字符串转阿拉伯数字,相似度等等...