• 61-结点选择(树形dp)


                      算法训练 结点选择  
    时间限制:1.0s   内存限制:256.0MB
          
    问题描述

    有一棵 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的正整数。

    参考:博客:http://blog.csdn.net/qiuchang008/article/details/21296923  

                视屏:https://www.bilibili.com/video/av12194537/?from=search&seid=11021974091564336752

    #include <bits/stdc++.h>
    using namespace std;
    vector <int> mp[100002];
    int v[100002][2];  //v[i][0]表示不选i时的和;v[i][1]表示选i时的和 
     
    
    void dfs(int s, int z){ //当前节点和它的前一个节点 
    	for(int i = 0; i < mp[s].size(); i++){ //遍历当前节点的子节点 
    		int x = mp[s][i];
    		if(x != z){    //如果当前节点的子节点和前一个节点相同,则是重复了 
    			dfs(x, s); //递归下去 
    			v[s][0] += max(v[x][1], v[x][0]);  //如果当前节点不选,则最大值为它与后一个节点选或不选情况下的最大值的和 
    			v[s][1] += v[x][0];	 //如果当前节点选了,那后一个节点就不能选		 
    		}
    	}
    }
    
    int main(){
    	std::ios::sync_with_stdio(false);
    	int n; 
    	cin >> n;
    	for(int i = 1; i <= n; i++){
    		cin >> v[i][1];
    	}
    	for(int i = 0; i < n - 1; i++){
    		int x, y;
    		cin >> x >> y;
    		mp[x].push_back(y);   
    		mp[y].push_back(x); //无向树 
    	}
    	for(int i = 1; i <= n; i++){ //找一个叶子节点,便于最后的确定答案,但不是必要的,若以总是以1位起始点也可以 
    		if(mp[i].size() == 1){
    			dfs(i, -1);
    			cout << max(v[i][0], v[i][1]) << endl;
    			break;
    		}
    	}
    	return 0;
    } 
    

      

  • 相关阅读:
    接口的故事
    Bash CookBook(一)--基础
    Spring学习笔记(四)--MVC概述
    Spring学习笔记(三)--Convert System设计
    java web框架发展的新趋势--跨界轻型App
    由Strurts2漏洞引开谈谈web代码安全问题
    Java线程同步之一--AQS
    Android Studio 0.4 + PhoneGap 3.3 开发环境的搭建
    redis的多线程
    原电商设计框架
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/8516802.html
Copyright © 2020-2023  润新知