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相关推荐

  1. 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} ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...

  3. Kamp;R练习题6-1统计关键词出现的次数

    这道练习题训练了: 1.结构体数组 2.二分查找 3.指针操作 ---- 都不难.但非常基础,我认为非常好,做完了记到博客上来,题目见k&R,实现例如以下: /** Practice of s ...

  4. 2017.9.17 kamp 思考记录

    一开始读错题了,以为只有一个座位. 首先,通过从一个点出发,它走过的路径是一个半环,如果把半环补上,那所有的环上的点答案都一样 对于不在环上的点,它一定是沿树上路径到达环上的点 所以剩下的问题就是求每 ...

  5. COCI2014/2015 Contest#1 PIRAMIDA 优化空间

    src 给1e6长的字符串,构造一个连续排列的金字塔,类似蛇形地放入.求第ai行字符ci有几个.ai有1e18,但询问k只有1e5. 对单个询问,容易想到求前后缀.因为第ai行之前的长度,能用求和公式 ...

  6. Kinect Kitchen(Kamp;K)期待你的到…

    Kinect Kitchen(K&K) Kinect项目 虽然全世界各地文化各不相同,但总会存在一个奇怪现象,就是在假期总会发生儿童伤害事件,而且40%是发生在家中,甚至家长眼皮底下.而家中危 ...

  7. COCI2014 KLOPKA

    题目大意: 在二维平面上有n个点,请你用一个正方形板将它全部盖住,请问最小的正方形的面积.某个点在正方形的边上,也算被覆盖.正方形的边必须与x轴或y轴平行. 输入: 第一行包含1个整数N(2<= ...

  8. COCI2014 PROSJEK

    题目大意: Mirko在数学课上以一种有趣的方式操作数列,首先,他写下一个数列A,然后他对该数列的前i个数求平均值,得到一个数列B. 比如数列A为1,3,2,6,8,那么数列B为: 即:1,2,2,3 ...

  9. 提高性能的Varnish缓存方案

    转载 http://www.s135.com/post/313/ arnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 使用 ...

最新文章

  1. Linux下查看显示器输出状态以及修改显示器工作模式(复制 or 扩展)
  2. 从零开始学python网络爬虫-从零开始学Python网络爬虫 PDF 下载
  3. AngularJS API
  4. KNN算法检测手势动作
  5. 道康宁有机硅助力动力电池发展
  6. Bootstrap插件通过noConfllict 避免冲突
  7. MDP马尔可夫决策过程(二)
  8. 在二维数组中寻找最小鞍点1181(该行最大值,该列最小值)(2种思路)
  9. js 数组合并并且去重
  10. OCR识别中级篇,Halcon实战项目讲解一,点状字符。
  11. 我的私房IT学习网站
  12. Java类加载机制与反射 jvm学习
  13. 【渝粤教育】广东开放大学 开放教育 学生创业案例 形成性考核 (59)
  14. oracle修改redo路径,在线修改redo文件的路径
  15. 独家:程序员必备Java API和类搜索辅助工具发布
  16. m低信噪比下GPS信号的捕获算法研究,使用matlab算法进行仿真
  17. greenplum列存
  18. 音频信号特征提取(1):短时特征之短时能量、短时功率、短时过零率
  19. 如何用python写游戏脚本?
  20. Vue.js入门(学习笔记)

热门文章

  1. 手机拍照成像误区解读
  2. css3 上线圆角效果
  3. 解决AJAX表单用POST方式提交Checkbox复选框的问题
  4. Outlook应用指南(1)——数据备份还原技巧
  5. 《C陷阱与缺陷》和《C专家编程》两本书又翻印了
  6. [转]关于父亲的故事
  7. html插入javascript变量,javascript如何引用变量?
  8. myemployees库的四张表介绍
  9. MySQL高级 - 复制 - 原理
  10. FactroyBean方式配置bean