題目來源:https://leetcode.com/problems/employee-importance/description/
小題大做。
題目大意
有一種員工信息的數據結構,其中包括員工的唯一ID,他的重要度和他的直系下屬的ID。
現給出員工id,計算該員工及其所有下屬的重要度之和。
// Employee info
class Employee {
public:
// It's the unique ID of each node.
// unique id of this employee
int id;
// the importance value of this employee
int importance;
// the id of direct subordinates
vector<int> subordinates;
};
例:
Input: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
Output: 11
解釋:
員工 1 的重要度爲 5 , 並擁有直系下屬員工 2 和員工 3;員工 2 的重要度爲 3 , 不擁有直系下屬;員工 3 的重要度爲 3 , 不擁有直系下屬。
計算員工 1 及其所有下屬的重要度之和 = 。
思路
1.把圖建起來
容易看出,這是一個有向圖。這裏我們用鄰接矩陣表示。
主對角線存員工重要度值。並用有向邊表示上下屬關係。
2.進行DFS
將得到的員工id作爲DFS起點,進行一遍DFS。
與普通DFS不同的是,這裏增加一個count變量,用於計算重要度之和。
一遍DFS可找到包含該起點的連通分量。連通分量中的每一個頂點,可在圖(鄰接矩陣)中找到這些頂點的重要度,併疊加。
最終得到的count即該員工及其所有下屬的重要度之和。
代碼
注:
- 由於題目沒有說明員工id是否可以爲0,所以數組下標都是直接按員工id來處理的,並沒有進行類似(id-1)的操作。
- 爲防止數組越界,將行列最大值設置爲比題目陳述的最大員工數2000還大1的2001。
#define MAX 2001
int visited[MAX];
class Solution {
public:
int getImportance(vector<Employee*> employees, int id) {
for (int i = 0; i < MAX; i++) visited[i] = 0;
int size = employees.size();
vector<int> mm(MAX, 0);
vector<vector<int>> M(MAX, mm);
// initialization
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
M[i][j] = 0;
// construct the graph
for (int i = 0; i < size; i++) {
int index = employees[i]->id;
M[index][index] = employees[i]->importance; // store the importance
for (int j = 0; j < (employees[i]->subordinates).size(); j++) {
M[index][(employees[i]->subordinates)[j]] = 1; // sign the relationship
}
}
int sum = DFS(M, MAX, MAX, id);
return sum;
}
int DFS(vector<vector<int>> M, int MRowSize, int MColSize, int v) {
int count = M[v][v];
visited[v] = 1; // begin with v
stack<int> mys;
mys.push(v);
while (!mys.empty()) {
int temp = mys.top();
mys.pop();
for (int i = 0; i < MRowSize; i++) {
if (M[temp][i] != 0 && visited[i] == 0) {
count += M[i][i];
mys.push(i);
visited[i] = 1;
}
}
}
return count;
}
};
遇到的問題
總是提示“Runtime Error ”。但是反覆查驗並沒有發現問題。
經測試,類似 M[i][j] = 0;
這樣的賦值語句通不過leetcode的檢測。
但是類似 M[0][0] = 0;
這樣的賦值語句卻可以行得通。
我猜想,可能是leetcode不支持二維數組的行列號爲變量這種方式的賦值?
我也搞不明白,還要和同學進行交流,繼續跟進這道題目。
其它解法
利用HashMap映射
wjx_sky對這道題進行了深入的探索,提供了“用hashMap將id與其對應的數據結構映射起來,找到id對應的員工信息並將其加入到一個隊列中”這一思路。
更簡潔的dfs寫法
當然,對於dfs的思路,還有更簡潔的寫法。