判断有向图中是否存在环

 1 // 将先修关系构成一张图,由每个数对的第二个数字向第一个数字连边。
 2 // 首先将所有入度为0的点进队,准备拓扑排序。
 3 // 宽搜过程中,将当前结点所关联的结点的入度减1;若发现新的入度为0的结点,则将其进队。
 4 // 最后如果遍历了所有结点,则说明可以满足要求;否则,先修关系存在环。
 5
 6 //查找是否有环
 7 class Solution
 8 {
 9 public:
10     bool canFinish(int numCourses, vector<vector<int>>& prerequisites)
11     {
12         vector<vector<int>> graph(numCourses);
13         vector<int> in_degree(numCourses, 0);
14         for (int i = 0; i < prerequisites.size(); i++)
15         {
16             in_degree[prerequisites[i][0]]++;
17             graph[prerequisites[i][1]].push_back(prerequisites[i][0]);
18         }
19
20         queue<int> q;
21         vector<bool> vis(numCourses, false);
22
23         for (int i = 0; i < numCourses; i++)
24             if (in_degree[i] == 0)
25                 q.push(i);
26         while (!q.empty())
27         {
28             int sta = q.front();
29             q.pop();
30             vis[sta] = true;
31             //有哪些邻边
32             for (int i = 0; i < graph[sta].size(); i++)
33             {
34                 in_degree[graph[sta][i]]--;// 入度-1
35                 if (in_degree[graph[sta][i]] == 0) //入度如果为0,加入队列
36                     q.push(graph[sta][i]);
37             }
38         }
39
40         //0->1->2
41         for (int i = 0; i < numCourses; i++)
42             if (vis[i] == false)
43                 return false;//有环
44         return true;//无环
45     }
46 };

原文地址:https://www.cnblogs.com/yuhong1103/p/12632915.html

时间: 2024-11-09 07:35:54

判断有向图中是否存在环的相关文章

拓扑排序,判断有向图中是否有环

[原创] 今天我们来聊聊有向图中环的判断,在数据结构中我们知道,通过拓扑排序可以判断有向图中是否存在环,对于有向图的存储我们采用邻接表的形势,这里为了简化链表的操作,我们省略了链表,避免了指针的麻烦,直接采用了c++中的vector来模拟链表,操作更加的方便:具体详细的使用,建议百度一下,这里不多说,至于拓扑排序的具体思想,相信大家应该都了解,那么直接上代码,如果有不理解的,建议查阅数据结构书籍,搞懂思想,结合这份代码,很好理解 1 #include <stdio.h> 2 #include

判断有向图中是否有环

1 #include<iostream> 2 #include<malloc.h> 3 using namespace std; 4 #define maxNum 110 ///定义邻接举证的最大定点数 5 int pre[maxNum]; 6 int post[maxNum]; 7 int point=0;///pre和post的值 8 bool is_DAG=true;///标识位,表示有向无环图 9 /* 10 顶点颜色表 vis[u] 11 0 白色,未被访问过的节点标白色

判断无向图/有向图中是否存在环

本文主要针对如何判断有向图/无向图中是否存在环的问题进行简单的论述. 一 无向图 1.利用DFS进行判断 利用DFS判断有向图是否存在环,是最为常用的一种方法,虽然这种方法很常用,但可参考的代码的实现比较少,下面对这种方法及其实现进行详细的阐述. 首先,利用DFS判断无向图中是否换的原理是:若在深度优先搜索的过程中遇到回边(即指向已经访问过的顶点的边),则必定存在环. 所以说,是否存在环的关键在于是否存在满足条件的"回边",那么如何判断回边呢? (1)首先,对图中的所有顶点定义三种状态

判断图中是否有环的方法

一.无向图 方法一:n算法: 原理是: 如果存在回路,则必存在一个子图,是一个环路.环路中所有顶点的度>=2. 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一. 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一. 如果最后还有未删除顶点,则存在环,否则没有环. 方法2: DFS搜索图,图中的边只可能是树边或反向边,一旦发现反向边,则表明存在环.该算法的复杂度为O(V). 二.有向图 主要有深度优先和拓扑排序两种方法 判断图中是否有环的方法

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

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

Q:判断链表中是否存在环的相关问题

问题:如何判断一个单向链表中是否存在环? 例如: 链表中存在环(B-->D): <-- <--^ | | v | A-->B-->C-->D 链表中不存在环: A-->B-->C-->D-->E-->F 解题思路: ??从一个实际的生活场景出发,两个人,在一个环形的操场上跑步的时候,如果有一个人跑得比另一个人还要快,那么,在n圈之后,这两个人总会在操场上的某个点相遇.将操场类比于链表中存在的环路径,将两个人看成两个指针,那么这道题的解题思路

LeetCode -- 判断链表中是否有环

思路: 使用两个节点,slow和fast,分别行进1步和2步.如果有相交的情况,slow和fast必然相遇:如果没有相交的情况,那么slow或fast必然有一个为null 相遇时有两种可能:1. 只是节点相交的情况,即:slow == fast但是 slow.next != fast.next2. 链表中存在环,即slow == fast 而且 slow.next == next 实现代码: public bool HasCycle(ListNode head) { // - for null

如何判断链表中是否有环

1.如何判断是否有环?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈. 2.如何计算环的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数. 3.如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点.头指针开始走,相遇的那个点就是连接点. 为什么呢?需要一个简单的计算过程: (1)当fast与slow相遇时,show肯定没有走完链表,而fast已经在还里走了n(n>= 1)圈.假设slow走了s步,那么fast走