美文网首页
210.课程表II!

210.课程表II!

作者: HamletSunS | 来源:发表于2019-10-29 16:21 被阅读0次

本题跟207的区别在于除了判断图是否有环外,还让你输出拓扑排序的一个序列。
207的时候一直没闹明白dfs跟拓扑排序的区别,通过这道题明白了,dfs其实是实现逆拓扑排序的一种手段。本题所构建的“邻接表”(tmp)其实是反向的,由顶点指向先修课程,而非先修课程指向顶点;换句话说,对于tmp这个邻接表来讲,它的逆拓扑排序其实就相当于是题目逻辑中的正拓扑排序,而逆拓扑排序又可以通过dfs来实现

class Solution {
public:
    vector<int> findOrder(int num, vector<vector<int>>& pre) {
        vector<int> ret;
        vector<int> flag(num,0);
        vector<vector<int>> tmp(num,vector<int>());
        
        int n=pre.size();
        for(int i=0;i<n;i++)
            tmp[pre[i][0]].push_back(pre[i][1]);
        
        bool ans=true;
        for(int i=0;i<num;i++){
            ans=ans && dfs(i,flag,tmp,ret);
        }
        if(ans){
            
            return ret;
        }
        else
            return vector<int>();
            
    }
    
    bool dfs(int i,vector<int> &flag,vector<vector<int>> &tmp,vector<int> &ret){
        if(flag[i]==1)
            return true;
        if(flag[i]==-1)
            return false;
        flag[i]=-1;
        int n=tmp[i].size();
        for(int j=0;j<n;j++){
            if(dfs(tmp[i][j],flag,tmp,ret))
                continue;
            else
                return false;
        }
        flag[i]=1;
        ret.push_back(i);
        return true;
    }
};

预计10分,实际32分

相关文章

网友评论

      本文标题:210.课程表II!

      本文链接:https://www.haomeiwen.com/subject/nsdgvctx.html