图的拓扑结构

本文探讨了图的拓扑排序方法,以及如何通过拓扑排序来判断图中是否存在环。以课程表为例,展示了这些概念的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的拓扑排序 , 判断是否有环
 step 1 : 构建元素的入度   (入度:有向图的某个顶点作为终点的次数和。  出度:起点)
 step 2 : 找到入度为0的元素, 压入栈中
 step 3 : 若栈不为空,将其pop,并找到与其相连接的元素,入度减1,若相连接元素此时入度为0,入栈

例题:课程表
在这里插入图片描述

class Solution {
public:
    //  图的拓扑排序 ,  判断是否有环

    // step 1 : 构建元素的入度   (入度:有向图的某个顶点作为终点的次数和。  出度:起点)
    // step 2 : 找到入度为0的元素, 压入栈中
    // step 3 : 若栈不为空,将其pop,并找到与其相连接的元素,入度减1,若相连接元素此时入度为0,入栈
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        
        vector<int>indegree(numCourses,0);
        stack<int> zeroindegree;
        unordered_map<int,vector<int>>sameele;     //  用来构建邻接表  (用multiset可以快一倍)
        for(auto pre : prerequisites)    // step 1 
        {
            sameele[pre[0]].push_back(pre[1]);
            indegree[pre[1]]++;
        }

        for(int i = 0 ; i < numCourses ; ++i) // step 2
        {
            if(indegree[i] == 0)
            {
                zeroindegree.push(i);
            }
        }
        int count = 0;//用于记录过程中入度为0的元素个数,若count==numCourse, 则该图无环
        while(!zeroindegree.empty())   // step 3
        {
            int temp = zeroindegree.top();
            zeroindegree.pop();
            ++count;
            
            for(auto pr : sameele[temp])         // 只在邻接表里搜索  速度快
            {        
                indegree[pr]--;
                if(indegree[pr] == 0)
                {
                    zeroindegree.push(pr);
                }                
            }
        }
        return count == numCourses;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值