数据结构之拓扑排序

1、活动

所有的工程或者某种流程都可以分为若干个小的工程或者阶段,我们称这些小的工程或阶段为"活动"。

2、AOV网

在⼀个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系的有向图 称为顶点表示活动的网(Activity On Vertex Network),简称AOV网。

3、拓扑序列

满足若从顶点Vi到Vj有⼀条路径,则在顶点序列中顶点Vi必在顶点Vj之前。则我们称这样的顶点序列为⼀个拓扑序列。

所谓的拓扑排序,其实就是对⼀个有向无环图构造拓扑序列的过程。

4、算法思想

(1) 在有向图中选⼀个没有前驱的顶点且输出之。

(2) 从图中删除该顶点和所有以它为尾的弧。

重复上述两步,直至全部顶点均已输出,或者当前图不存在无前驱的顶点为止,后⼀种情况说明有向图中存在环。

cpp 复制代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

// 拓扑排序函数
// n:顶点数  adj:邻接表  inDegree:每个顶点的入度
bool topologicalSort(int n<int>><int>& inDegree)
{
<int> q;<int> res; // 存储拓扑排序结果

    // 步骤1:找到所有没有前驱(入度为0)的顶点,入队
    for (int i =<= n; i++)
    {
        if (inDegree[i] == 0)
        {
            q.push(i);
        }
    }

    while (!q.empty())
    {
        // 取出一个无前驱顶点并输出
        int cur = q.front();
        q.pop();
        res.push_back(cur);

        // 步骤2:删除该顶点为尾的所有弧,更新后继节点入度
        for (int next : adj[cur])
        {
            inDegree[next]--;
            // 后继节点无前驱则入队
            if (inDegree[next] == 0)
            {
                q.push(next);
            }
        }
    }

    // 节点数不足说明有环
    if (res.size() != n)
    {
        return false;
    }

    // 输出拓扑序列< "拓扑排序结果:";
    for (int node : res)
    {
       < " ";
    }
    cout< endl;
    return true;
}

int main()
{
    // 6个顶点的有向图测试
    int n = 6;<int>> adj(n + 1<int> inDegree(n + 1, 0);

    // 构建图的边<int, int>> edges = {{1,2}, {1,3}, {2,4}, {3,4}, {4,5}, {4,6}};
    for (auto& e : edges)
    {
        int u = e.first;
        int v = e.second;
        adj[u].push_back(v);
        inDegree[v]++;
    }

    // 执行拓扑排序并判环
    if (!topologicalSort(n, adj, inDegree))
    {
        cout< "有向图存在环路,无法完成拓扑排序< endl;
    }

    return 0;
}

拓扑排序在实际的⽣产中很常见,最经典的例子就是课程表,当然还可以进行代码的依赖关系处理等等。

相关推荐
CQU_JIAKE5 小时前
10.9【A】
数据结构
第25小时记录5 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·python
Logic1019 小时前
C语言/数据结构数位DP题解:平滑排列数字统计——区间内相邻位差不超过K的数字个数
c语言·数据结构·动态规划·时间复杂度·数位dp·算法题·前导零处理
wang090710 小时前
硬着头皮学数据结构和算法之Myers算法
数据结构·算法
垆边人似月.11 小时前
华为机试题 :最长递增子序列题目
数据结构·c++·算法·华为
yi0111 天前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
禾小西1 天前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
H.莓飛1 天前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有1 天前
Leetcode35.搜索插入位置
数据结构·算法·leetcode