题意:小C上周末和他可爱的同学小A一起去X湖玩。
X湖景区一共有n个景点,这些景点由n-1条观光道连接着,从每个景点开始都可以通过观光道直接或间接地走到其他所有的景点。小C带着小A从1号景点开始游玩。游览完第一个景点后,先由小C决定下一个游览的景点,他们一起走去那个景点玩。接下来,他们轮流决定他们下一步去哪个景点玩。他们不会选择已经走过的景点,因为重复游览一个景点是无趣的。当他们无法选择下一个景点时,他们就结束旅程。
小C是好动的男孩纸,所以他希望游览的过程尽量长,也就是走过观光道的长度和最大。而小A是文静的女孩纸,她希望游览的过程尽量短。小A和小C都极度聪明,且他们的目光都足够长远,他们做出的决策都是对自己最优的。由于小C在旅游前就仔细研究了X湖景区的地图,他可以在旅行开始前就用自己惊人的数学能力推算出他和小A旅行的路径长度。
小C的梦境是美好的。在他的梦里,他和小A又进行了n-1次旅行,第i次旅行从i+1号点开始,每次也是小C先决定下一个景点,然后小A,然后小C……直到旅行结束。现在小C希望你对于所有n次旅行,求出他和小A旅行的路径长度。

对于100%的数据,N ≤ 300000, c[i] ≤ 1e9

对于60%的数据,N ≤ 3000

思路:对于60分,容易想到枚举根,做N次O(N)的DP,时间复杂度O(n)

对于100分,模拟样例后发现两个直接相连的节点U与V,其DP值只有U与V点时不同,所以考虑当根从U到V时O(1)转移求出新的DP[u]与DP[v]

注意此处不需要保证整个DP数组值都为正确,只要U的值与V的值正确即可

可以想到当U的最值由V转移时,两者交换后V必须从U的另一支转移,所以记录次值

调参大法好

 var f:array[..,..]of int64;
ans:array[..]of int64;
head,vet,next,len,flag:array[..]of longint;
n,tot,i,x,y,z:longint;
oo:int64; procedure add(a,b,c:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
head[a]:=tot;
end; procedure dfs(u:longint);
var e,v,de:longint;
t:int64;
begin
flag[u]:=;
e:=head[u];
de:=;
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
dfs(v); inc(de);
t:=f[v,]+len[e];
if (t>f[u,])or(f[u,]=) then
begin
f[u,]:=f[u,]; f[u,]:=t;
end
else if (t<=f[u,])and(t>f[u,])or(f[u,]=) then f[u,]:=t; t:=f[v,]+len[e];
if (t<f[u,])or(f[u,]=) then
begin
f[u,]:=f[u,]; f[u,]:=t;
end
else if (t>=f[u,])and(t<f[u,])or(f[u,]=) then f[u,]:=t; end;
e:=next[e];
end; end; procedure change(u:longint);
var e,v:longint;
t,t1,t2,t3,t4:int64;
begin
e:=head[u]; flag[u]:=;
t1:=f[u,]; t2:=f[u,]; t3:=f[u,]; t4:=f[u,]; ans[u]:=f[u,];
while e<> do
begin
v:=vet[e]; if flag[v]= then begin e:=next[e]; continue; end;
if f[v,]+len[e]=t1 then t:=f[u,]+len[e]
else t:=f[u,]+len[e];
if (t<f[v,])or(f[v,]=) then
begin
f[v,]:=f[v,]; f[v,]:=t;
end
else if (t<f[v,])or(f[v,]=) then f[v,]:=t; if f[v,]+len[e]=t3 then begin t:=f[u,]+len[e];end
else t:=f[u,]+len[e]; if (t>f[v,])or(f[v,]=) then
begin
f[v,]:=f[v,]; f[v,]:=t;
end
else if (t>f[v,])or(f[v,]=) then f[v,]:=t;
change(v);
e:=next[e];
end; end; begin
assign(input,'travel.in'); reset(input);
assign(output,'travel.out'); rewrite(output);
oo:=<<;
readln(n); //f[u,]zuida f[u,]cida
//f[u,]zuixiao f[u,]cixiao
for i:= to n- do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end; dfs();
fillchar(flag,sizeof(flag),);
change();
for i:= to n do writeln(ans[i]);
close(input);
close(output);
end.

【NOIP2016练习】T2 旅行(树形DP,换根)的更多相关文章

  1. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...

  2. 树形dp换根,求切断任意边形成的两个子树的直径——hdu6686

    换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树 ...

  3. poj3585 Accumulation Degree(树形dp,换根)

    题意: 给你一棵n个顶点的树,有n-1条边,每一条边有一个容量z,表示x点到y点最多能通过z容量的水. 你可以任意选择一个点,然后从这个点倒水,然后水会经过一些边流到叶节点从而流出.问你最多你能倒多少 ...

  4. poj3585 Accumulation Degree[树形DP换根]

    思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移 ...

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

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

  6. Acwing-287-积蓄程度(树上DP, 换根)

    链接: https://www.acwing.com/problem/content/289/ 题意: 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号 ...

  7. 2019ICPC沈阳网络赛-D-Fish eating fruit(树上DP, 换根, 点分治)

    链接: https://nanti.jisuanke.com/t/41403 题意: State Z is a underwater kingdom of the Atlantic Ocean. Th ...

  8. bzoj 1131 [POI2008]Sta 树形dp 转移根模板题

    [POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1889  Solved: 729[Submit][Status][Discu ...

  9. cf219d 基础换根法

    /*树形dp换根法*/ #include<bits/stdc++.h> using namespace std; #define maxn 200005 ]; int root,n,s,t ...

  10. Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】

    传送门:http://codeforces.com/contest/1092/problem/F F. Tree with Maximum Cost time limit per test 2 sec ...

随机推荐

  1. 【线段树 扫描线 二维数点】loj#6276. 果树

    路径计数转成二维数点很妙啊 题目描述 NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求. 这颗果树有 $N$ 个节点,标号 $1 \ldots N$ ...

  2. Ubuntu 下安装mysqlclient报错

    pip3 install mysqlclient 报错信息 问题描述: Complete output from command python setup.py egg_info: /bin/sh: ...

  3. 【python】python安装和运行报错汇总

    本文主要用于汇总在python开发过程中遇到的各种环境.工具相关问题,便于后续遇到相关问题,及时搞定,持续更新. 一.安装pip失败,具体如下: 错误信息: python setup.py insta ...

  4. 代理工具--fiddle

    正则匹配 1)前缀为“EXACT:”表示完全匹配:只有match=rules时,才匹配 2)无前缀表示基本搜索,表示搜索到字符串就匹配:只要match中包含了rules的字符串,即可 3)前缀为“NO ...

  5. 【linux】【指令集】查看是否打开selinux

    > getenforce selinux相关原理资料参考 <鸟哥的linux私房菜>  http://cn.linux.vbird.org/linux_server/0210netw ...

  6. type和object

    一.定义 1.object是所有新式类的父类 2.type是所有类的类    二.解析   下面通过代码来比较一下object和type的关系(__class__获取所属的类,__bases__获取父 ...

  7. HTTPS的请求与响应

    HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...

  8. 笔记-python-实用-程序运算时间计算

    方法1 import datetime starttime = datetime.datetime.now() #long running endtime = datetime.datetime.no ...

  9. 如何用ADMINISTRATOR登陆WIN7

    Windows 7系统出于安全考虑,将系统超级管理员帐户(Administrator)隐藏了,不允许"普通用户"使用.很多时候特别是安装一些应用软件时,由于兼容的问题,普通权限的用 ...

  10. NO_PUBKEY

    * 现象:$ sudo apt-get update时警告如下: W: GPG error: http://ppa.launchpad.net precise Release: The followi ...