zoukankan      html  css  js  c++  java
  • ZOJ 3201 Tree of Tree


    树形DP。。。。

    Tree of Tree

    Time Limit: 1 Second      Memory Limit: 32768 KB

    You're given a tree with weights of each node, you need to find the maximum subtree of specified size of this tree.

    Tree Definition 
    A tree is a connected graph which contains no cycles.

    Input

    There are several test cases in the input.

    The first line of each case are two integers N(1 <= N <= 100), K(1 <= K <= N), where N is the number of nodes of this tree, and K is the subtree's size, followed by a line with N nonnegative integers, where the k-th integer indicates the weight of k-th node. The following N - 1 lines describe the tree, each line are two integers which means there is an edge between these two nodes. All indices above are zero-base and it is guaranteed that the description of the tree is correct.

    Output

    One line with a single integer for each case, which is the total weights of the maximum subtree.

    Sample Input

    3 1
    10 20 30
    0 1
    0 2
    3 2
    10 20 30
    0 1
    0 2

    Sample Output

    30
    40
    Author: LIU, Yaoting
    Source: ZOJ Monthly, May 2009 


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>

    using namespace std;

    int dp[200][200],valu[200],cnt[200],ans,N,K;
    vector<int> g[200];

    int dfs(int u,int fa)
    {
        cnt=1;
        for(int i=0;i<g.size();i++)
        {
            int v=g;
            if(v==fa) continue;
            cnt+=dfs(v,u);
        }
        for(int k=0;k<g.size();k++)
        {
            int v=g[k];
            if(v==fa) continue;
            for(int i=cnt;i>=1;i--)
            {
                for(int j=0;j<i&&j<=cnt[v];j++)
                    dp=max(dp,dp[i-j]+dp[v][j]);
            }
        }
        if(cnt>=K)
        {
            ans=max(ans,dp[K]);
        }
        return cnt;
    }

    int main()
    {
        while(scanf("%d%d",&N,&K)!=EOF)
        {
            memset(dp,0,sizeof(dp));
            for(int i=0;i<N;i++)
            {
                scanf("%d",valu+i);
                dp[1]=valu;
                g.clear();
            }
            for(int i=0;i<N-1;i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                g[a].push_back(b);
                g.push_back(a);
            }
            ans=0;dfs(0,-1);
            printf("%d ",ans);
        }
        return 0;
    }
    * This source code was highlighted by YcdoiT. ( style: Emacs )

  • 相关阅读:
    2012 regional 。。
    joj2443
    java笔记代码实现汉诺塔移动过程和移动次数
    java笔记增加虚拟机内存
    java笔记修改javadoc为中文API信息
    java笔记String类格式化当天日期转换符文档
    java笔记正则表达式的运用(包括电话,邮箱验证等)
    java笔记String类对象解析与运用
    Java笔记IO流的运用
    java笔记BigDecimal的使用
  • 原文地址:https://www.cnblogs.com/CKboss/p/3350824.html
Copyright © 2011-2022 走看看