zoukankan      html  css  js  c++  java
  • hustoj1353 节点选择 树形dp

    1353: 结点选择

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 6  解决: 2
    [提交][状态][讨论版]

    题目描述

    问题描述

    有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?

    选择3、4、5号点,权值和为 3+4+5 = 12 。
    数据规模与约定

    对于20%的数据, n <= 20。

    对于50%的数据, n <= 1000。

    对于100%的数据, n <= 100000。

    权值均为不超过1000的正整数。

    输入

    输入格式

    第一行包含一个整数 n 。

    接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。

    接下来一共 n-1 行,每行描述树上的一条边。

    输出

    输出格式
    输出一个整数,代表选出的点的权值和的最大值。

    样例输入

    5
    1 2 3 4 5
    1 2
    1 3
    2 4
    2 5

    样例输出

    12

    提示

    本题n过大,用邻接表储存就行,注意判断后继节点的时候,不要在回溯到前驱节点

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct node{
       int to,nex;
    }edge[200005];
    int head[100005];
    int dp[100005][2];
    bool vis[100005];
    int cnt;
    
    void addedge(int u,int v){
        edge[cnt].to=v;
        edge[cnt].nex=head[u];
        head[u]=cnt++;
        edge[cnt].to=u;
        edge[cnt].nex=head[v];
        head[v]=cnt++;
    }
    
    void dfs(int v,int pre){
        vis[v]=true;
        for(int i=head[v];i!=-1;i=edge[i].nex){
                int tmp=edge[i].to;
            if(tmp==pre)//注意
                continue;
            dfs(tmp,v);
            dp[v][0]+=max(dp[tmp][0],dp[tmp][1]);
            dp[v][1]+=dp[tmp][0];
    
        }
    }
    
    int main(){
       int n;
       while(scanf("%d",&n)!=EOF){
           memset(head,-1,sizeof(head));
           memset(dp,0,sizeof(dp));
           memset(vis,false,sizeof(vis));
           for(int i=1;i<=n;i++){
              scanf("%d",&dp[i][1]);
           }
           int a,b;
           cnt=0;
            for(int i=1;i<n;i++){
                scanf("%d%d",&a,&b);
                addedge(a,b);
            }
            dfs(1,-1);
            int ans=max(dp[1][0],dp[1][1]);
            printf("%d
    ",ans);
       }
       return 0;
    }
  • 相关阅读:
    Ida动态修改android程序的内存数据和寄存器数值,绕过so文件的判断语句
    Ida双开定位android so文件
    IDA调试android so文件.init_array和JNI_OnLoad
    超EASY 五步实现Eclipse ASN.1 SDK和插件安装
    记录重装系统的艰苦奋斗历程
    音标
    有道建昆老师~Reading Comprehensive
    Linux之普通用户用sudo建立文件和root用户建立的区别
    名句
    20200307(13)
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5244303.html
Copyright © 2011-2022 走看看