TopCoder SRM679(Div.1) Easy FiringEmployees

Posted on By 二价氢

题目大意

给定一棵树,要求删去若干子树,使得剩下的点权值最大

解法

将权值和小于0的子树删掉即可,自下而上遍历,即使用DFS即可

###Code

class FiringEmployees {
public:
	vector <int> manager, salary, productivity; 
	vector <int> son[2505];
	int dfs(int nx) {
		int rx = 0;
		for (int i = 0; i < son[nx].size(); i++) {
			rx += dfs(son[nx][i]);
		}
		if (nx)
			rx += productivity[nx - 1] - salary[nx - 1];
		return max(rx, 0);
	}
	int fire(vector <int> _manager, vector <int> _salary, vector <int> _productivity) {
		manager = _manager;
		salary = _salary;
		productivity = _productivity;
		for (int i = 0; i < manager.size(); i++)
			son[manager[i]].push_back(i + 1);
		return dfs(0);
	}
};

Level Upper 2016 - TopCoder 250 : 2 / 5