构建一张由x到比x都有钱的有向图(题目说明逻辑自洽,因此为无环有向图)。
cpp实现:
/*
* @lc app=leetcode.cn id=851 lang=cpp
*
* [851] 喧闹和富有
*/
#include<vector>
#include<iostream>
using namespace std;
#include<functional>
// @lc code=start
class Solution {
public:
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
int n = quiet.size();
vector<vector<int>> g(n); // 创建x到所有比x有钱的有向图
for (auto& r:richer){
g[r[1]].push_back(r[0]);
}
vector<int> ans(n,-1);
function<void(int)> dfs = [&](int x){
if (ans[x]!=-1){
return; // 已经访问过
}
ans[x] = x;
for (int y:g[x]){
dfs(y);
if (quiet[ans[y]]<quiet[ans[x]]){
ans[x] = ans[y];
}
}
};
for (int i=0; i<n; ++i){
dfs(i);
}
return ans;
}
};
// @lc code=end
int main(){
vector<vector<int>> richer{{1,0},{2,1},{3,1},{3,7},{4,3},{5,3},{6,3}};
vector<int> quiet{3,2,5,4,6,1,7,0};
Solution s;
vector<int> ans = s.loudAndRich(richer,quiet);
for (int num:ans){
cout<<num<<" ";
}
return 0;
}