zoukankan      html  css  js  c++  java
  • 结点选择

    题目:
    问题描述
    有一棵 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
  • 相关阅读:
    css3 动画
    jQuery toast 淡入淡出提示
    JavaScript事件——拖拉事件
    Vue -- element-ui 限制只能输入number
    css 移动端页面,在ios中,margin-bottom 没有生效
    django 快速搭建blog
    python 正则表达式口诀
    [转]python os模块 常用命令
    【转】scapy 构造以太网注入帧
    【转】关于Scapy
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10397210.html
Copyright © 2011-2022 走看看