210課程表2


 


 DFS+拓撲排序

class Solution {
    bool dfs(int i,vector<int>&flags,vector<int>&res,vector<vector<int>>&record)
    {
        if(flags[i]==1)return false;
        if(flags[i]==-1)return true;
        
        flags[i]=1;
        
        for(auto j:record[i])
            if(dfs(j,flags,res,record)==false)return false;
        //遍歷到底之後,該節點所有相鄰節點都加入了模擬棧時,將自己加入模擬棧中
        res.push_back(i);
        flags[i]=-1;  
        return true;         
    }
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        //建立一個二維數組,組建鄰接表
        vector<vector<int>>record(numCourses,vector<int>());
        //初始化
        for(auto tmp:prerequisites)
            record[tmp[1]].push_back(tmp[0]);
        vector<int>res;//模擬棧,最後翻轉
        //0表示未被訪問過
        vector<int>flags(numCourses,0);
        for(int i=0;i<numCourses;i++)
        {
            //for(int i=0;i<numCourses&&flags[i]!=-1;i++)// 用法錯誤,邏輯錯誤
            //放在此處的,跟放在for循環中不一樣的邏輯
            if(flags[i]!=-1)
                if(dfs(i,flags,res,record)==false)return {};
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章