851. 喧闹和富有

构建一张由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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值