• 结点选择


    题目:
    问题描述
    有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?
    
    输入格式
    第一行包含一个整数 n 。
    接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。
    接下来一共 n-1 行,每行描述树上的一条边。
    
    输出格式
    输出一个整数,代表选出的点的权值和的最大值。
    
    样例输入
    5
    1 2 3 4 5
    1 2
    1 3
    2 4
    2 5
    
    样例输出
    12
    
    样例说明
    选择3、4、5号点,权值和为 3+4+5 = 12 。
    数据规模与约定
    
    对于20%的数据, n <= 20。
    对于50%的数据, n <= 1000。
    对于100%的数据, n <= 100000。
    权值均为不超过1000的正整数。
    --------------------- 
    //树形动态规划 
    #include<iostream>
    #include<vector>
    using namespace std;
    int n;
    int w[100000+5]={0};
    int vis[100000+5]={0};
    int dp[100000+5][2]={0};
    vector<int> G[100000+5];
    
    void gcd(int x){
        vis[x]=1;
        for(int i=0;i<G[x].size();i++){
            int e=G[x][i];//选择的点 
            if(vis[e]) continue;
            gcd(e);
            dp[x][1]+=dp[e][0];
            dp[x][0]+=max(dp[e][1],dp[e][0]);
    //        dp[x][1]+=dp[e][0];
        }
        dp[x][1]+=w[x];
    }
    int main()
    {
        cin>>n;
        int x,y;
        for(int i=1;i<=n;i++) cin>>w[i];
        
        for(int i=1;i<=n;i++) G[i].clear();
        
        for(int i=0;i<n-1;i++) {
            cin>>x>>y;
            G[x].push_back(y);
            G[y].push_back(x);
        }
        gcd(1);
        cout<<max(dp[1][0],dp[1][1])<<endl;
        return 0;
    } 
    View Code
  • 相关阅读:
    DB2中创建表
    orcle定时备份
    db2的定时备份
    web.xml 中 resource-ref 的注意事项
    bootstrap
    jQuery
    web聊天室
    Django web 进阶
    Django自定义分页、bottle、Flask
    Queue、进程、线程、协程
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10397210.html
Copyright © 2020-2023  润新知