HDU3534(SummerTrainingDay13-C tree dp)

Posted Penn000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU3534(SummerTrainingDay13-C tree dp)相关的知识,希望对你有一定的参考价值。

Tree

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1574    Accepted Submission(s): 511


Problem Description

In the Data structure class of HEU, the teacher asks one problem: How to find the longest path of one tree and the number of such longest path?
 

 

Input

There are several test cases. The first line of each case contains only one integer N, means there are N nodes in the tree. N-1 lines follow, each line has three integers w,v and len, indicate that there is one edge between node w and v., and the length of the edge is len.

 

 

Output

For each test case, output the length of longest path and its number in one line.
 

 

Sample Input

4 1 2 100 2 3 50 2 4 50 4 1 2 100 2 3 50 3 4 50
 

 

Sample Output

150 2 200 1
 

 

Source

 

//2017-08-16
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1000010;
const int INF = 0x3f3f3f3f;

//链式前向星存图
int head[N], tot;
struct Edge{
    int to, next, w;

}edge[N<<2];

void add_edge(int u, int v, int w){
    edge[tot].w = w;
    edge[tot].to = v;
    edge[tot].next = head[u];
    head[u] = tot++;
}

void init(){
    tot = 0;
    memset(head, -1, sizeof(head));
}

//dp[u]记录以u为根的子树,过u往下的最长路径。
//cnt[u]记录子树u上最长路径的数目。
int dp[N], cnt[N], ans, num;

void dfs(int u, int fa){
    dp[u] = 0;
    cnt[u] = 1;
    for(int i = head[u]; i != -1; i = edge[i].next){
        int v = edge[i].to;
        int w = edge[i].w;
        if(v == fa)continue;
        dfs(v, u);
        if(dp[u]+dp[v]+w > ans){
            ans = dp[u]+dp[v]+w;
            num = cnt[u]*cnt[v];
        }else if(dp[u]+dp[v]+w == ans)
              num += cnt[u]*cnt[v];
        if(dp[u] < dp[v]+w){
            dp[u] = dp[v]+w;
            cnt[u] = cnt[v];
        }else if(dp[u] == dp[v]+w)
              cnt[u] += cnt[v];
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    int n;
    while(scanf("%d", &n)!=EOF){
        int u, v, w;
        init();
        for(int i = 0; i < n-1; i++){
            scanf("%d%d%d", &u, &v, &w);
            add_edge(u, v, w);
            add_edge(v, u, w);

        }
        ans = -INF;
        num = 0;
        dfs(1, 0);
        printf("%d %d\n", ans, num);
    }

    return 0;

}

 

以上是关于HDU3534(SummerTrainingDay13-C tree dp)的主要内容,如果未能解决你的问题,请参考以下文章

HDU4417(SummerTrainingDay08-N 主席树)

HDU2157(SummerTrainingDay05-F dp)

HDU3359(SummerTrainingDay05-I 高斯消元)

HDU4704(SummerTrainingDay04-A 欧拉降幂公式)

HDU2167(SummerTrainingDay02-D 状态压缩dp)

HDU4845(SummerTrainingDay02-C 状态压缩bfs)