拓扑排序

本文深入讲解了拓扑排序的基本原理及实现方法,包括Kahn算法和DFS两种主要算法。通过LeetCode上的Course Schedule问题,详细介绍了如何利用邻接表和点的入度来判断有向图是否存在环。

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

拓扑排序的原理及其实现
LeetCode 207. Course Schedule
LeetCode discuss

Kahn算法

  1. 从有向图中选取一个没有前驱(即入度为0)的顶点,并输出之;
  2. 从有向图中删去此顶点以及所有以它为尾的弧;
  3. 如果最后还有顶点,则图中有环
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
    vector<vector<int>> matrix(numCourses); //邻接表
    vector<int> indegree(numCourses);  //点的入度
    for (auto it : prerequisites) {
        matrix[it.second].push_back(it.first);
        indegree[it.first]++;
    }
    queue<int> q;
    for (int i = 0; i < numCourses; ++i) {
        if (indegree[i] == 0) q.push(i);   //入度为0的顶点加入
    }
    int removed_nodes = 0;
    while (!q.empty()) {
        int course = q.front();
        q.pop();
        removed_nodes++;
        for (auto i : matrix[course]) {
            if (--indegree[i] == 0)
                q.push(i);
        }
    }
    return removed_nodes == numCourses; //是否有环        
}

DFS

Kahn算法考虑的是入度,DFS考虑出度。从0出度递推

L ← Empty list that will contain the sorted nodes
S ← Set of all nodes with no outgoing edges
for each node n in S do
    visit(n) 
function visit(node n)
    if n has not been visited yet then
        mark n as visited
        for each node m with an edgefrom m to ndo
            visit(m)
        add n to L
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值