Leetcode 207 课程表 (拓扑排序,判断有向图环)

定义一个队列Q,把入度为0的结点入队

若Q不为空,则取队首结点,删去所有从该点出发的边,并把这些边所到达结点的入度减一,若某个节点入度减为0,则将它入队

反复进行如上操作,直到队列为空。(当总的入队次数大于节点数时,跳出循环)

如果这时入过队的节点数恰好等于节点总数,则为有向无环图。否则有环。

class Solution {
public:
    static const int maxn = 10000;
    vector<int> gra[maxn];
    int co = 0;
    int count[maxn] = { 0 };  //入度
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        queue<int> Q;
        for (int i = 0;i < prerequisites.size();i++) {
            gra[prerequisites[i][1]].push_back(prerequisites[i][0]);
            count[prerequisites[i][0]]++;
        }
        int co = 0;
        for (int i = 0;i < numCourses;i++)
            if (count[i]==0) {
                Q.push(i);
            }
        while (!Q.empty()) {
            int cur = Q.front();
            Q.pop();
            co++;
            if (co > numCourses)break;
            for (int i = 0;i < gra[cur].size();i++) {
                count[gra[cur][i]]--;
                if (count[gra[cur][i]] == 0) {
                    Q.push(gra[cur][i]);
                }
            }
            gra[cur].clear();
        }
        if (co == numCourses)return true;
        else return false;
    }
};

原文地址:https://www.cnblogs.com/suuusu/p/11056514.html

时间: 2024-11-02 01:44:10

Leetcode 207 课程表 (拓扑排序,判断有向图环)的相关文章

拓扑排序判断有向图是否有回路

1 #include <iostream> 2 #include <queue> 3 #include <string> 4 using namespace std; 5 6 //表结点 7 typedef struct ArcNode{ 8 int adjvex;//该弧所指向的顶点的位置 9 ArcNode *nextarc; 10 }ArcNode; 11 12 //头结点 13 typedef struct VNode{ 14 string data;//顶点信

LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)

和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到,在for (auto p: prerequistites)中特判了输入中可能出现的平行边或自环. 代码: class Solution { public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { // [0, {1, 2, 3}], me

hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】

Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3566    Accepted Submission(s): 1395 Problem Description Recently, scientists find that there is love between any of two people. For

拓扑排序 --- 判断是否有回路

Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3823    Accepted Submission(s): 1738 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is

拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393

1 //拓扑排序判断是否有环 2 #include<cstdio> 3 #include<algorithm> 4 #include<string.h> 5 #include<math.h> 6 #include<queue> 7 using namespace std; 8 typedef long long ll; 9 const int maxn=1e2+10; 10 int G[maxn][maxn]; 11 int in[maxn];

LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)

求有向图中是否有环. 法一:拓扑排序 用一个队列维护所有入度为0的节点,每次弹出一个节点v,查看从v可达的所有节点u; 将u的入读减一,若u的入度此时为0, 则将u加入队列. 在队列为空时,检查所有节点的入度,若所有节点入度都为0, 则存在这样的一个拓扑排序 -- 有向图中不存在环. 代码: class Solution { public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisite

[LeetCode] 207. 课程表(拓扑排序,BFS)

题目 现在你总共有 n 门课需要选,记为?0?到?n-1. 在选修某些课程之前需要一些先修课程.?例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? 示例 1: 输入: 2, [[1,0]] 输出: true 解释:?总共有 2 门课程.学习课程 1 之前,你需要完成课程 0.所以这是可能的. 示例 2: 输入: 2, [[1,0],[0,1]] 输出: false 解释:?总共有 2 门课程

Lightoj 1003 - Drunk(拓扑排序判断是否有环 Map离散化)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1003 题意是有m个关系格式是a b:表示想要和b必须喝a,问一个人是否喝醉就看一个人是否能把所有种类的饮料喝完,能输出Yes,不能输出No: 其实就是有向图判断是否存在环,可以用拓扑排序来求 拓扑排序:每次找到一个入度为0的点加入队列,删除与之相连的边,循环操作,得到的序列就是拓扑序(前面的必须出现在后面的前面): #include<stdio.h> #include<str

UVA-1572 Self-Assembly(拓扑排序判断有向环)

题目: 给出几种正方形,每种正方形有无穷多个.在连接的时候正方形可以旋转.翻转. 正方形的每条边上都有一个大写英文字母加'+'或'-'.00,当字母相同符号不同时,这两条边可以相连接,00不能和任何边相连. 判断给出的正方形如果能无限连接下去就输出unbounded.不能就输出bounded. 思路: 这个题读完之后,一点思路都没有,看完紫书上的分析知道是用拓扑排序来判断有向环,但具体的构造还是不会-- 1.将每个正方形看作一条边,在正方形每两条边上的字母(不包括00)之间连一条有向边构成一个有