Leetcode 207 课程表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_zhuo_/article/details/88550830

思路:拓扑排序,判断无环

1.建立二维数组record[ ][ ] ,记录每个顶点的相邻点

2.Hash[ ]记录每个顶点的入度

3.将入度=0的点进栈

4.每次出栈一个点x,把record[x]行所有点的入度-1,产生入度=0的点则进栈

5.重复4直至栈为空

6.遍历Hash[ ],若每个元素都是0,则无环,否则有环。

tip:因为要自己建模,所以建立二维数组记录比较方便(这里在邻接矩阵的基础上作了修改,只记录可达点,从而减少时间消耗),不建议写邻接表,建立过程比较繁琐。

代码:

class Solution {

public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<vector<int>> record(numCourses);//存储每个节点相邻的边
        
        int Hash[10010];//记录入度
        memset(Hash,0,sizeof(Hash));
        
        //初始化二维数组,记录可达关系
        for(int i=0;i<prerequisites.size();i++)
        {
            pair<int,int> tmp=prerequisites[i];
            int x=tmp.first;
            int y=tmp.second;
            record[y].push_back(x);  
            Hash[x]++;
        }
        //0度入栈
        stack<int> s;
        for(int i=0;i<numCourses;i++)
        {
            if(Hash[i]==0) s.push(i);
        }
        
        //图的拓扑排序
        while(!s.empty())
        {
            int tmp=s.top();
            s.pop();
            for(int i=0;i<record[tmp].size();i++)
            {
                int k=record[tmp][i];
                Hash[k]--;
                if(Hash[k]==0) s.push(k);
            }
        }
        for(int i=0;i<numCourses;i++)
        {
            if(Hash[i]!=0) return false;
        }
        return true;
    }
};

猜你喜欢

转载自blog.csdn.net/Mr_zhuo_/article/details/88550830
今日推荐