BZOJ3743 : [Coci2014]Kamp
d[x][0]表示x点向下走且回到x点的最少代价
d[x][1]表示x点向下走但不回到x点的最少代价
d[x][2]表示x点向下走的最长路
d[x][3]表示x点向下走的次长路
u[x][0]表示x点向上走且回到x点的最少代价
u[x][1]表示x点向上走但不回到x点的最少代价
一遍树形DP即可
ans[i]=min(d[i][0]+u[i][1],d[i][1]+u[i][0])
#include<cstdio>
#define N 500010
typedef long long ll;
int n,k,i,j,x,y,z,g[N],nxt[N<<1],v[N<<1],w[N<<1],ed,f[N],dis[N],h,t,q[N],size[N],de[N];
ll d[N][4],u[N][2],tmp;
bool is[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
inline ll min(ll x,ll y){return x<y?x:y;}
int main(){read(n),read(k);for(i=1;i<n;i++)read(x),read(y),read(z),add(x,y,z),add(y,x,z);while(k--)read(x),is[x]=1;q[h=t=1]=1;while(h<=t)for(j=g[x=q[h++]];j;j=nxt[j])if(v[j]!=f[x])f[q[++t]=v[j]]=x,dis[v[j]]=w[j];for(i=n;i;i--){size[x=q[i]]=is[x];for(j=g[x];j;j=nxt[j])if(v[j]!=f[x]&&size[v[j]]){size[x]+=size[v[j]];d[x][0]+=d[v[j]][0]+2LL*w[j];tmp=d[v[j]][1]-d[v[j]][0]-w[j];if(tmp<d[x][2])d[x][3]=d[x][2],d[x][2]=tmp,de[x]=v[j];else d[x][3]=min(d[x][3],tmp);}d[x][1]=d[x][0]+d[x][2];}for(i=2;i<=n;i++)if(size[1]>size[x=q[i]]){u[x][0]=u[f[x]][0]+d[f[x]][0]-d[x][0];u[x][1]=u[f[x]][1]+d[f[x]][0];if(de[f[x]]==x)u[x][1]=min(u[x][1],u[f[x]][0]+d[f[x]][0]+d[f[x]][3]);else u[x][1]=min(u[x][1],u[f[x]][0]+d[f[x]][1]);u[x][1]-=d[x][0]+dis[x];if(!size[x])u[x][0]+=2*dis[x],u[x][1]+=2*dis[x];}for(i=1;i<=n;i++)printf("%lld\n",min(d[i][0]+u[i][1],d[i][1]+u[i][0]));return 0;
}
BZOJ3743 : [Coci2014]Kamp相关推荐
- BZOJ3743 COCI2015Kamp(树形dp)
设f[i]为由i开始遍历完子树内所要求的点的最短时间,g[i]为由i开始遍历完子树内所要求的点最后回到i的最短时间.则g[i]=Σ(g[j]+2),f[i]=min{g[i]-g[j]+f[j]-1} ...
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...
- Kamp;R练习题6-1统计关键词出现的次数
这道练习题训练了: 1.结构体数组 2.二分查找 3.指针操作 ---- 都不难.但非常基础,我认为非常好,做完了记到博客上来,题目见k&R,实现例如以下: /** Practice of s ...
- 2017.9.17 kamp 思考记录
一开始读错题了,以为只有一个座位. 首先,通过从一个点出发,它走过的路径是一个半环,如果把半环补上,那所有的环上的点答案都一样 对于不在环上的点,它一定是沿树上路径到达环上的点 所以剩下的问题就是求每 ...
- COCI2014/2015 Contest#1 PIRAMIDA 优化空间
src 给1e6长的字符串,构造一个连续排列的金字塔,类似蛇形地放入.求第ai行字符ci有几个.ai有1e18,但询问k只有1e5. 对单个询问,容易想到求前后缀.因为第ai行之前的长度,能用求和公式 ...
- Kinect Kitchen(Kamp;K)期待你的到…
Kinect Kitchen(K&K) Kinect项目 虽然全世界各地文化各不相同,但总会存在一个奇怪现象,就是在假期总会发生儿童伤害事件,而且40%是发生在家中,甚至家长眼皮底下.而家中危 ...
- COCI2014 KLOPKA
题目大意: 在二维平面上有n个点,请你用一个正方形板将它全部盖住,请问最小的正方形的面积.某个点在正方形的边上,也算被覆盖.正方形的边必须与x轴或y轴平行. 输入: 第一行包含1个整数N(2<= ...
- COCI2014 PROSJEK
题目大意: Mirko在数学课上以一种有趣的方式操作数列,首先,他写下一个数列A,然后他对该数列的前i个数求平均值,得到一个数列B. 比如数列A为1,3,2,6,8,那么数列B为: 即:1,2,2,3 ...
- 提高性能的Varnish缓存方案
转载 http://www.s135.com/post/313/ arnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 使用 ...
最新文章
- Linux下查看显示器输出状态以及修改显示器工作模式(复制 or 扩展)
- 从零开始学python网络爬虫-从零开始学Python网络爬虫 PDF 下载
- AngularJS API
- KNN算法检测手势动作
- 道康宁有机硅助力动力电池发展
- Bootstrap插件通过noConfllict 避免冲突
- MDP马尔可夫决策过程(二)
- 在二维数组中寻找最小鞍点1181(该行最大值,该列最小值)(2种思路)
- js 数组合并并且去重
- OCR识别中级篇,Halcon实战项目讲解一,点状字符。
- 我的私房IT学习网站
- Java类加载机制与反射 jvm学习
- 【渝粤教育】广东开放大学 开放教育 学生创业案例 形成性考核 (59)
- oracle修改redo路径,在线修改redo文件的路径
- 独家:程序员必备Java API和类搜索辅助工具发布
- m低信噪比下GPS信号的捕获算法研究,使用matlab算法进行仿真
- greenplum列存
- 音频信号特征提取(1):短时特征之短时能量、短时功率、短时过零率
- 如何用python写游戏脚本?
- Vue.js入门(学习笔记)