bzoj1060 [ZJOI2007]时态同步

来源:互联网 发布:软件众包平台 编辑:程序博客网 时间:2024/05/16 12:40

题目

树上做递推
每个节点对答案的贡献为f[x]-f[to[i]]-val[i],val为边权,f[x]为节点到其叶子节点最长的路径长度。

#include<bits/stdc++.h>#define N 500000using namespace std;int n,rt,x,y,z;int first[N+1],nex[2*N+1],to[2*N+1],val[2*N+1],siz;long long f[N+1],ans;int read(){    int x=0;    char c=getchar();    while(c<'0'||c>'9')c=getchar();    while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();    return x;}void add(int x,int y,int z){    nex[siz]=first[x];    first[x]=siz;    to[siz]=y;    val[siz]=z;    siz++;}void DFS(int x,int fa){    f[x]=0;    for(int i=first[x];i!=-1;i=nex[i])    {        int u=to[i];        if(u==fa)continue;        DFS(u,x);        f[x]=max(f[x],f[u]+val[i]);    }    for(int i=first[x];i!=-1;i=nex[i])        if(to[i]!=fa)ans+=f[x]-f[to[i]]-val[i];}int main(){    //freopen("in.txt","r",stdin);    memset(first,-1,sizeof(first));    n=read(),rt=read();    for(int i=1;i<n;i++)    {        x=read(),y=read(),z=read();        add(x,y,z),add(y,x,z);    }    DFS(rt,0);    cout<<ans;    return 0;} 
原创粉丝点击