图(三色标记法,初概念)

//颜色染色法

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>>g(numCourses);
        for(auto&q:prerequisites){
			g[q[0]].push_back(q[1]);
		}
		vector<int>color(numCourses,0);
		//0表示未访问,1表示正在访问,2表示访问结束
		auto dfs=[&](this auto&&dfs,int x)->bool{
			color[x]=1;
			for(auto&p:g[x]){
				if(color[p]==1||color[p]==0&&dfs(p)){
					return true;
				}
			}
			color[x]=2;
			return false;
		};
		for(int i=0;i<numCourses;i++){
			if(dfs(i)) return false;
		}
		return true;
    }
};

//拓扑排序(kahn算法)

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
           vector<vector<int>>e(numCourses);
        vector<int>din(numCourses);//入度
        for(auto&q:prerequisites){
			e[q[1]].push_back(q[0]);//邻接表
		    din[q[0]]++;
        }
        queue<int>tp;
        for(int i=0;i<numCourses;i++){
            if(din[i]==0) tp.push(i);
        }
        int ans=0;
        while(!tp.empty()){
            int x=tp.front();
            tp.pop();
            ans++;
            for(auto&q:e[x]){
                if(--din[q]==0){
                    tp.push(q);
                }
            }
        }
        return ans==numCourses;
    }
};
posted @ 2024-12-17 22:42  Qacter  阅读(20)  评论(0)    收藏  举报