题意:给定n个节点,标号为0~n-1,每个节点都有一个value值,求这棵树上每个节点的最小子节点;
输入:relation = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], value = [3,2,5,4,6,1,7,0]
输出:[5,5,2,5,4,5,6,7]
输入:relation = [], value = [0]
输出:[0]
题解一:DFS+记忆化
vector<int> minSonNode(vector<vector<int>> &relation, vector<int> &value) {
int n = value.size();
vector<vector<int>> g(n);
for (vector<int> &a : relation)
g[a[1]].emplace_back(a[0]);
vector<int> ret(n, -1);
function<void(int)> dfs = [&](int x) {
if (ret[x] != -1)
return;
ret[x] = x;
for (int &y : g[x]) {
dfs(y);
ret[x] = (value[ret[y]] < value[ret[x]]) ? ret[y] : ret[x];
}
};
for (int i = 0; i < n; ++i)
dfs(i);
return ret;
}