美文网首页
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