zoukankan      html  css  js  c++  java
  • leetcode 802. Find Eventual Safe States

    1.出度为0则为满足条件的节点,取所有出度为0的到queue中,之后循环减去这些队列中的出度,正反索引减少访问时间

    class Solution {
    public:
        vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
                vector<int> ret;
                int n=graph.size();
                vector<int> for_graph(n);
                //forward and reverse index
                vector<unordered_set<int>> rev_graph(n, unordered_set<int>());
                //priority_queue<int,vector<int>,greater<int>> min_q;
                queue<int> q;
                //initialize
                for(int i=0;i<n;++i){
                    if(graph[i].empty()){
                        q.push(i);
                        //min_q.push(i);
                    }else{
                        for (int j : graph[i]) {
                            ++for_graph[i];
                            rev_graph[j].insert(i);
                        }
                    }
                }
                while(!q.empty()){
                    int tmp=q.front();
                    q.pop();
                    for(int for_idx:rev_graph[tmp]){
                        --for_graph[for_idx];
                        if(for_graph[for_idx]==0){
                            q.push(for_idx);
                            //min_q.push(for_idx);
                        }
                    }
                }
                //while(!min_q.empty()){
                //    //cout<<min_q.top()<<endl;
                //    ret.push_back(min_q.top());
                //    min_q.pop();
                //}
                for(int i=0;i<n;++i){
                    if(for_graph[i]==0)ret.push_back(i);
                }
                return ret;
        }
    };

    2.dfs检测每个节点的neighor中是否有环

    class Solution {
    public:
        vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
                vector<int> ret;
                int n=graph.size();
                vector<int> safe(n);
                for(int i=0;i<n;++i){
                    if(dfs(graph,i,safe))ret.push_back(i);
                }
                return ret;
        }
        bool dfs(vector<vector<int>>& graph,int idx,vector<int>& safe){
            if(safe[idx]>0) return safe[idx]==2;
            safe[idx]=1;
            for(int i:graph[idx]){
                if(safe[i]==2)continue;
                if(safe[i]==1||!dfs(graph, i, safe))return false;
            }
            safe[idx]=2;
            return true;
        }
    };
  • 相关阅读:
    web窗体asp:Repeater循环绑定
    Exception:No data is available for encoding 936
    GFL: Generalized Focal Loss
    Stitcher: Feedbackdriven Data Provider for Object Detection
    C++ 动态伸缩线程池
    docker pull 配置代理
    docker 配置国内镜像地址
    关于Chrome浏览器http链接跳转成https的问题
    CentOS 防火墙入门
    两个整数相除得得到结果百分比【我】
  • 原文地址:https://www.cnblogs.com/Babylon/p/14768589.html
Copyright © 2011-2022 走看看