题目描述
由于软件技术的提升,原有部署网络中某些节点可以撤掉,这样可以简化网络节省维护成本。但是要求撤掉网络节点时,不能同时撤掉原来两个直接相互连接的节点。输入的网络是一个满二叉树结构,每个网络节点上标注一个数值,表示该节点的每年维护成本费用。给定每个输入网络,按照要求撤掉某些节点后,求出能够节省的最大的维护成
解答要求
时间限制: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);
}