zoukankan      html  css  js  c++  java
  • 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
    ", ans, num);
        }
    
        return 0;
    
    }
  • 相关阅读:
    [NHibernate]条件查询Criteria Query
    [JQuery]用InsertAfter实现图片走马灯展示效果
    [NHibernate]HQL查询
    [NHibernate]基本配置与测试
    [HTML/CSS]margin属性用法
    [HTML/CSS]盒子模型,块级元素和行内元素
    [Asp.net MVC]Asp.net MVC5系列——布局视图
    [c#基础]值类型和引用类型的Equals,==的区别
    用中间件实现读负载均衡的数据库群集
    论数据库连接池对中间件性能的重要性
  • 原文地址:https://www.cnblogs.com/Penn000/p/7375346.html
Copyright © 2011-2022 走看看