JZOJ 5906. 【NOIP2018模拟10.15】传送门 (portal)
Description
8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪。但GLaDOS想把传送枪据为己有,于是把Normalgod扔进了一间实验室。这间实验室是一棵有n个节点的树。现在Normalgod在一号节点,出口也在一号节点,但为了打开它,必须经过每一个节点按下每个节点的开关,出口才能打开。GLaDOS为了杀死Normalgod,开始在实验室里释放毒气,因此Normalgod必须尽快逃出这间实验室。
当然,Normalgod手中的传送枪是可以使用的。传送枪可以发射出两个颜色不同的传送门。Normalgod可以从其中一个传送到另一个。尽管传送枪可以在视野范围内的任何一个经过特殊处理的表面打开一扇传送门,但这间实验室的设计使得Normalgod只能在他所处的房间内打开一个传送门。 在已经存在了一个同颜色的传送门时,打开新的传送门会使与它同颜色的旧门消失。传送和打开传送门所需时间为0。
显然,利用传送枪会让Normalgod更快解决谜题,可Normalgod死在了按下最后一个按钮的路上。尽管如此,GLaDOS还是很想知道到底Normalgod最快能用多久逃出去,这对她的实验室设计方法论有重要的指导作用。作为GLaDOS的算法模块,你要完成这个任务。本题时限为2000ms
Input
第一行一个整数n。之后n-1行,每行三个整数ui,vi,ai ,表示有一条从ui 连向vi ,花费时间为ai 的通道。
Output
一行一个数T,表示最小的脱逃时间。
Sample Input
5
1 2 2
2 3 3
2 4 5
1 5 1
Sample Output
13
样例说明
1–> open1–> 5–> open2–> use(1)–> 2–> 3–> open2–> use(1)–> 2–> 4–> open2–> use(1)–> exit
Data Constraint
Solution
我们发现每条边至少会被走过一次,而最多被走过两次。
且在一个子树尚未遍历完的情况下不会突然跑去别的子树。
于是考虑树形DP,设 f[x]f[x]f[x] 表示以 xxx 为根的子树遍历完回到 xxx 的最小时间。
如果在 xxx 点不开传送门,那么就可从其儿子 yyy (之间的边权值为 vvv)累加来;
如果在 xxx 点开传送门,则在 yyy 子树中不断走,在某一点传回 xxx ,
显然该点为 yyy 子树中的最长链(长度设为 len[y]len[y]len[y])。
且 yyy 子树中其他的每条边都会走两遍(子树边权和设为 sum[y]sum[y]sum[y])。
转移方程即为:f[x]+=min(f[y]+v∗2,sum[y]∗2−len[y]+v)f[x]+=min(f[y]+v*2,sum[y]*2-len[y]+v)f[x]+=min(f[y]+v∗2,sum[y]∗2−len[y]+v)
Code
#include<cstdio>
#include<cctype>
using namespace std;
typedef long long LL;
const int N=1e6+5;
int tot;
int first[N],nex[N<<1],en[N<<1],w[N<<1];
LL len[N],f[N],sum[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline LL max(LL x,LL y)
{return x>y?x:y;
}
inline LL min(LL x,LL y)
{return x<y?x:y;
}
inline void insert(int x,int y,int z)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;w[tot]=z;
}
void dfs(int x,int y)
{for(int i=first[x];i;i=nex[i])if(en[i]^y){dfs(en[i],x);len[x]=max(len[x],len[en[i]]+w[i]);sum[x]+=sum[en[i]]+w[i];f[x]+=min(f[en[i]]+w[i]*2,sum[en[i]]*2-len[en[i]]+w[i]);}
}
int main()
{freopen("portal.in","r",stdin);freopen("portal.out","w",stdout);int n=read();for(int i=1;i<n;i++){int x=read(),y=read(),z=read();insert(x,y,z);insert(y,x,z);}dfs(1,0);printf("%lld",f[1]);return 0;
}
JZOJ 5906. 【NOIP2018模拟10.15】传送门 (portal)相关推荐
- jzoj 5906. 【NOIP2018模拟10.15】传送门(树形dp)
5906. [NOIP2018模拟10.15]传送门 Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normal ...
- jzoj5904. 【NOIP2018模拟10.15】刺客信条(并查集)
5904. [NOIP2018模拟10.15]刺客信条 Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一 ...
- 5906. 【NOIP2018模拟10.15】传送门 (portal)
Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normalgod扔进了一间实验室.这间实验室是一棵有n个节点的树 ...
- jzoj 5906.【NOIP2018模拟10.15】传送门
Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normalgod扔进了一间实验室.这间实验室是一棵有n个节点的树 ...
- JZOJ 5904. 【NOIP2018模拟10.15】刺客信条(AC)
Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的天赋,成为了杰出的刺 ...
- jzoj 5904. 【NOIP2018模拟10.15】刺客信条 二分+并查集
刺客信条 时间限制: 1 Sec 内存限制: 512 MB 题目描述 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害, 决心成为一名刺客. ...
- JZOJ 5904【NOIP2018模拟10.15】刺客信条
昨晚改出来了 被墙联通坑死了 手改大数据...... 先放题目 Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决 ...
- JZOJ 5905. 【NOIP2018模拟10.15】黑暗之魂(darksoul)
Description oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰在一张地图中探险.地图中有n个篝火(也就是存档点).在篝火处休息可以将生命值恢复满 ...
- [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)
题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景: 尊者神高达很穷,所以他需要跑商来赚钱 题目描述: 基三的地图可以看做 n 个城 ...
最新文章
- css动画 animation
- linux shell which 和 whereis 区别
- 新华社报道关注松果出行:助力国家碳达峰碳中和目标
- valueOf()、toString()
- 解题报告 树形图计数
- zookeeper分布式锁原理及实现
- ubuntu上下左右变成BD
- python数据处理源代码_python数据分析与应用源数据和代码
- 几招让你轻松解决 Uni-app、原生 App 混合开发问题
- 西电机器学习简答题核心考点汇总(期末真题,教材西瓜书)
- 基于数字证书的windows安全登录
- 极客日报:微信自动抢红包软件被判赔 475 万;日本科学家打破网速全球纪录;JavaScript蝉联最受欢迎编程语言
- 还可以这么玩:盘点iOS 11中Siri的12项新功能
- WIN10安装VC6.0无法使用的解决办法
- CANopen COB-ID 使能PDO功能
- 【M365运维】查看电脑硬盘加密状态是否同步到 Intune
- 重置 winsocks
- 搭建(WSTMart)php电商环境时缺少fileinfo函数
- mysql set类型的用户变量,mysql用户变量的圈套
- 客运售票员_汽车站售票员工作心得体会