本文涉及知识点

C++BFS算法

LeetCode690. 员工的重要性

你有一个保存员工信息的数据结构,它包含了员工唯一的 id ,重要度和直系下属的 id 。

给定一个员工数组 employees,其中:

employees[i].id 是第 i 个员工的 ID。

employees[i].importance 是第 i 个员工的重要度。

employees[i].subordinates 是第 i 名员工的直接下属的 ID 列表。

给定一个整数 id 表示一个员工的 ID,返回这个员工和他所有下属的重要度的 总和。

示例 1:

【C++BFS】690. 员工的重要性_员工

输入:employees = [[1,5,[2,3]],[2,3,[]],[3,3,[]]], id = 1
输出:11
解释:
员工 1 自身的重要度是 5 ,他有两个直系下属 2 和 3 ,而且 2 和 3 的重要度均为 3 。因此员工 1 的总重要度是 5 + 3 + 3 = 11 。

示例 2:

【C++BFS】690. 员工的重要性_c++_02

输入:employees = [[1,2,[5]],[5,-3,[]]], id = 5
输出:-3
解释:员工 5 的重要度为 -3 并且没有直接下属。
因此,员工 5 的总重要度为 -3。

提示:
1 <= employees.length <= 2000
1 <= employees[i].id <= 2000
所有的 employees[i].id 互不相同。
-100 <= employees[i].importance <= 100
一名员工最多有一名直接领导,并可能有多名下属。
employees[i].subordinates 中的 ID 都有效。

C++BFS

根据生活常识,我们假定没有任何两位员工互为领导。如果互为领导,本题无法计算。
我们令 本人是自己的0层下属,直接下属是1层下属,直接下属的直接下属是二级下属…
leves[i]记录id 的i层下属。
BFS的状态表示:cur。
BFS的后续状态:cur的直接下属。
BFS的初始状态:leves[0] = {id};
BFS的返回值,所有的cur重要性之和。
BFS的重复处理:根据生活常识,无需处理重复。
预处理:向量vIDtoPtr记录 各id对应的员工信息。

代码

核心代码

class Employee {
		public:
			int id;
			int importance;
			vector<int> subordinates;
		};
		class Solution {
		public:
			int getImportance(vector<Employee*> employees, int id) {
				vector<Employee*> vIDToPtr(2000 + 1);
				for ( auto& ptr : employees) {
					vIDToPtr[ptr->id] = ptr;
				}
				queue<int > que;
				que.emplace(id);
				int ret = 0;
				while (que.size()) {
					int cur = que.front();
					que.pop();
					auto ptr = vIDToPtr[cur];
					ret += ptr->importance;
					for (const auto& next : ptr->subordinates) {
						que.emplace(next);
					}
				}
				return ret;
			}
		};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

单元测试

namespace LeetCode690
{
	//LeetCode690. 员工的重要性
	TEST_CLASS(LeetCode690)
	{
	public:
		class Employee {
		public:
			int id;
			int importance;
			vector<int> subordinates;
		};
		class Solution {
		public:
			int getImportance(vector<Employee*> employees, int id) {
				vector<Employee*> vIDToPtr(2000 + 1);
				for ( auto& ptr : employees) {
					vIDToPtr[ptr->id] = ptr;
				}
				queue<int > que;
				que.emplace(id);
				int ret = 0;
				while (que.size()) {
					int cur = que.front();
					que.pop();
					auto ptr = vIDToPtr[cur];
					ret += ptr->importance;
					for (const auto& next : ptr->subordinates) {
						que.emplace(next);
					}
				}
				return ret;
			}
		};
		vector<Employee> employees;
		vector<Employee*> ToPtr(vector<Employee>& employees) {
			vector<Employee*> ret;
			for (auto& e : employees) {
				ret.emplace_back(&e);
			}
			return ret;
		}
		int id;
		TEST_METHOD(TestMethod1)
		{
			employees = { {1,5,{2,3}},{2,3,{}},{3,3,{}} }, id = 1;
			auto res = Solution().getImportance(ToPtr(employees), id);
			AssertEx(11, res);
		}
		TEST_METHOD(TestMethod2)
		{
			employees = { {1,2,{5}},{5,-3,{}} }, id = 5;
			auto res = Solution().getImportance(ToPtr(employees), id);
			AssertEx(-3, res);
		}
	};
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.



测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

【C++BFS】690. 员工的重要性_宽度优先_03