网络升级改造——华为2023.5.24

文章目录

题目描述

由于软件技术的提升,原有部署网络中某些节点可以撤掉,这样可以简化网络节省维护成本。但是要求撤掉网络节点时,不能同时撤掉原来两个直接相互连接的节点。输入的网络是一个满二叉树结构,每个网络节点上标注一个数值,表示该节点的每年维护成本费用。给定每个输入网络,按照要求撤掉某些节点后,求出能够节省的最大的维护成

解答要求
时间限制:C/C++2000ms,其他语言:4000ms 内存限制:C/C++256MB其他语言:512MB
输入
第一行:一个正整数N,表示后面有N个数值。1<=N<= 10000
第二行:N个非负整数,表示网络节点每年的维护成本,按照满二又树的”广度优先遍历序号”给出。0表示不存在该关联节点,0只会存在于叶子节点上。每个数字的取值范围为[0.1000]
输出
能够节省的最大的维护成本。

  • 样例1
    输入
    7
    5 3 5 0 6 0 1
    输出
    12
    解释:第一行输入:7,表示后面有7个数值;第二行输入:5 3 5 8 6 1,表示“表示网络节点每年的维护成本,按照满二又树的度优先历序号”给出输出: 12,能够节省的最大维护成本: 5+6+1
  • 样例2
    输入
    7
    2 7 8 2 4 9 2
    输出
    19

代码

#include<iostream>
#include<unordered_map>
#include<vector>
#include<queue>
using namespace std;
typedef struct TreeNode{
	int val;
	TreeNode *left, *right; 
}*Tree;

class Solution{
public:

	//创建二叉树 
	TreeNode* CreateTree(){
	//输入 
	int n;
	cin>>n;
	vector<int> v(n, 0);
	for(int i=0;i<n;i++){cin>>v[i];}
	
	//利用队列创建二叉树 
	if (n==0) return NULL;
	TreeNode* root = new TreeNode();
	root->val = v[0];
	
	queue<TreeNode*> q;
    q.push(root);
    int i=1;
    while(i<n){
    	auto node = q.front(); q.pop();
    	if(v[i]){
    		node->left = new TreeNode(); node->left->val = v[i];
    		q.push(node->left);
		}
		i++;
		if(i==n) break;
		if(v[i]){
			node->right = new TreeNode(); node->right->val = v[i];
    		q.push(node->right);
		}
		i++;
	}
	return root;
}

	unordered_map <TreeNode*, int> f, g;
	void dfs(TreeNode* node) {
	    if (!node) {
	        return;
	    }
	    dfs(node->left);
	    dfs(node->right);
	    f[node] = node->val + g[node->left] + g[node->right];
	    g[node] = max(f[node->left], g[node->left]) + max(f[node->right], g[node->right]);
	}
	
	void rob(TreeNode* root) {
	    dfs(root);
	    cout<<max(f[root], g[root])<<endl;
	}
}; 



int main(){
	Solution s;
	TreeNode* T = s.CreateTree();
	s.rob(T);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值