[ZJOI 2007] 时态同步

[题目链接]

         https://www.lydsy.com/JudgeOnline/problem.php?id=1060

[算法]

        贪心

        时间复杂度 : O(N)

[代码]

      

#include<bits/stdc++.h>
using namespace std;
#define MAXN 500010

struct edge
{
        int to,w,nxt;
} e[MAXN << 1];

int n,S,tot,cnt;
int head[MAXN];
long long ans;
long long mx[MAXN];

template <typename T> inline void read(T &x)
{
    T f = 1; x = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
    x *= f;
}
inline void addedge(int u,int v,int w)
{
        tot++;
        e[tot] = (edge){v,w,head[u]};
        head[u] = tot;
}
inline void dfs(int u,int fa)
{
        int son = 0;
        long long sum = 0;
        for (int i = head[u]; i; i = e[i].nxt)
        {
                int v = e[i].to , w = e[i].w;
                if (v == fa) continue;
                dfs(v,u);    
                son++;    
                sum += (mx[v] + w);
                mx[u] = max(mx[u],mx[v] + w);
        }        
        ans += son * mx[u] - sum;
}

int main() 
{
        
        read(n); read(S);
        for (int i = 1; i < n; i++)
        {
                int u , v , w;
                read(u); read(v); read(w);
                addedge(u,v,w);
                addedge(v,u,w);
        }
        dfs(S,0);
        printf("%lld\n",ans);
        
        return 0;
    
}

 

posted @ 2018-09-09 22:05  evenbao  阅读(148)  评论(0编辑  收藏  举报