时态同步

题面

树形dp

细节:

  1. 一定要双向加边,是无向图。
  2. 既然是无向图,维护时不要把到父节点的边计算了。
  3. 维护的顺序一定不能乱。
  4. 答案要用long long 存。
#include <bits/stdc++.h>
#define MAXN 1000005
using namespace std;
struct Edge{int next,to,dis;} edge[MAXN];
int n,s,a,b,t,maxn[MAXN],cnt,head[MAXN];  
long long ans;  

void addedge(int from, int to, int dis)  
{
    edge[++cnt].next=head[from];
    edge[cnt].to=to;
    edge[cnt].dis=dis;
    head[from]=cnt;
}

void dfs(int x, int fa) 
{
    for(int i=head[x]; i; i=edge[i].next)
        if(edge[i].to!=fa) dfs(edge[i].to, x);
    for(int i=head[x]; i; i=edge[i].next)
        if(edge[i].to!=fa) maxn[x]=max(maxn[x], edge[i].dis);
    for(int i=head[x]; i; i=edge[i].next)
        if(edge[i].to!=fa) ans+=(maxn[x]-edge[i].dis);
    for(int i=head[fa]; i; i=edge[i].next)
        if(edge[i].to==x) edge[i].dis+=maxn[x];
}

int main()
{
    scanf("%d%d",&n,&s);
    for(int i=1; i<=n-1; i++)
    {
        scanf("%d%d%d",&a,&b,&t);
        addedge(a, b, t);
        addedge(b, a, t); 
    }
    dfs(s, 0);
    printf("%lld\n",ans);
    return 0;
}

  

posted @ 2019-07-18 14:18  [jackeylove]  阅读(133)  评论(0编辑  收藏  举报