Description

一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的。
有K个人(分布在K个不同的点)要集中到一个点举行聚会。
聚会结束后需要一辆车从举行聚会的这点出发,把这K个人分别送回去。
请你回答,对于i=1~n,如果在第i个点举行聚会,司机最少需要多少时间把K个人都送回家。

Input

第一行两个数,n,K。
接下来n-1行,每行三个数,x,y,z表示x到y之间有一条需要花费z时间的边。
接下来K行,每行一个数,表示K个人的分布。

Output

输出n个数,第i行的数表示:如果在第i个点举行聚会,司机需要的最少时间。
 
树形dp
定义人所在位置为标记点
求出结点i到每个标记点的路径经过的边的总长b[i]
求出结点i到标记点的最远距离c[i],过程中还要记录次远距离c2[i]
每个结点的答案即为b[i]*2-c[i]
转化为有根树,第一次dfs用子节点信息更新父节点信息
第二次dfs用父节点信息更新子节点信息
#include<cstdio>
#include<vector>
#define N 500005
typedef long long lint;
struct edge{
    int to,w;
    edge(int _,int __){to=_,w=__;}
};
std::vector<edge>v[N];
bool d[N];
lint a[N],b[N],c[N],c2[N];
int cp[N];
int n,k,p1,p2,p3;
,){
    ;
    ,u;~i;i--){
        if((u=v[w][i].to)==pa)continue;
        int l=v[w][i].w;
        dfs1(u,w);
        a[w]+=a[u];
        b[w]+=b[u];
        if(a[u])b[w]+=l;
        else continue;
        if(c[u]+l>=c[w])c2[w]=c[w],c[w]=c[u]+l,cp[w]=u;
        else if(c[u]+l>=c2[w])c2[w]=c[u]+l;
    }
}
,){
    ,u;~i;i--){
        if((u=v[w][i].to)==pa)continue;
        int l=v[w][i].w;
        b[u]=b[w];
        )b[u]-=l;
        if(a[u]<k)b[u]+=l;
        lint m=(u==cp[w]?c2[w]:c[w])+l;
        ;
        else if(m>=c2[u])c2[u]=m;
        dfs2(u,w);
    }
}
int main(){
    scanf("%d%d",&n,&k);
    ;i<n;i++){
        scanf("%d%d%d",&p1,&p2,&p3);
        v[p1].push_back(edge(p2,p3));
        v[p2].push_back(edge(p1,p3));
    }
    ;i<k;i++)scanf(;
    dfs1(),dfs2();
    ;i<=n;i++)printf(-c[i]);
    ;
}

bzoj3743 Kamp的更多相关文章

  1. 【BZOJ3743】[Coci2015]Kamp 树形DP

    [BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举 ...

  2. bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2

    3743: [Coci2015]Kamp Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 229[Submit][Status ...

  3. [Bzoj3743][Coci2015] Kamp【换根Dp】

    Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...

  4. bzoj3743: [Coci2015]Kamp

    首先树dp求出一个点的答案 然后再一遍dfs换根(是叫做换根吗.. 详见代码 #include <iostream> #include <cstdio> #include &l ...

  5. 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点 ...

  6. 2018.09.28 bzoj3743: [Coci2015]Kamp(树形dp)

    传送门 这是一道很有意思的题. 我们把所有的关键点都提出来,当成一棵有边权的虚树. 然后发现虚树上除最后不回到虚根的那条路径外外每条边都会被走两遍. 显然要让答案最优,不走的路径应该在虚树的直径上,于 ...

  7. [bzoj3743 Coci2015] Kamp(树形dp)

    传送门 Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的 ...

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

  9. 『kamp 树形dp』

    kamp Description jz 市的云台山是个很美丽的景区,小 x 暑期到云台山打工,他的任务是开景区的大巴. 云台山景区有 N 个景点,这 N 个景点由 N-1 条道路连接而成,我们保证这 ...

随机推荐

  1. C# DataSet取值

    1.读取dataset中某表某行某列的值: dataset.Tables[].Rows[].ItemArray[].ToString()dataset.Tables[0].Rows[0][0]; 该示 ...

  2. C++ Primer:第七章:类

    定义一个类: class Myclass{ int data_i; string data_str; public: int getdata_i() const { return data_i; } ...

  3. UVa 489 刽子手游戏

    游戏规则,计算机想一个单词让你猜,你每次可以猜一个字母,如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母则计算机会在一副"刽子手"画上填一笔,这幅画一共需要7笔就能完 ...

  4. Python路径总结

    Windows下文件路径的分隔符是'\'反斜杠,文件路径也是一个字符串,牵扯到'\'在Python字符串中存在转义的情况,就对这个问题做一个探究. Python字符串中要使用'\'时有两种方法: 使用 ...

  5. java DecimalFormat

    public class Test{ public static void main(String[] args) throws Exception{ /*DecimalFormat参数,如果是0则会 ...

  6. 受限玻尔兹曼机RBM

    相关算法 python代码参考http://blog.csdn.net/zc02051126/article/details/9668439#(作少量修改与注释) #coding:utf8 impor ...

  7. jquery ajax POST 例子详解

    function test(){ $.ajax({ //提交数据的类型 POST GET type:"POST", //提交的网址 url:"testLogin.aspx ...

  8. MySQL – optimizer_search_depth

    Working on customer case today I ran into interesting problem – query joining about 20 tables (thank ...

  9. IPy

    IPy生成网段列表from IPy import IPip = IP('192.168.0.0/16')print ip.len()for x in ip:print (x) ip的属性,'PUBLI ...

  10. 2.Nexus更新索引

    1.手动更新1.  下载索引文件在http://repo.maven.apache.org/maven2/.index/ 中下载nexus-maven-repository-index.gznexus ...