数据结构之拓扑排序

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;
}

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

相关推荐
白狐_79810 小时前
408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结
数据结构
Forever Nore13 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
旖旎夜光16 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
不一样的故事12617 小时前
芯片设计是一个高度复杂、分工精细的系统工程
数据结构·经验分享
梁辰兴18 小时前
软件工程:面向数据结构的设计方法
数据结构·软件工程·梁辰兴·面向数据结构的设计方法·jackson方法·warnier方法·方法比较
白狐_79819 小时前
408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题
数据结构·算法
hold?fish:palm20 小时前
链表的基本原理和实现(C++版本)
数据结构·c++·链表
码完就睡20 小时前
数据结构——树、二叉树基础概念
数据结构·算法
疯狂打码的少年1 天前
【数据结构】栈:定义、顺序栈与链式栈
数据结构·笔记
wabs6661 天前
关于图论【最短路径之Bellman_ford 算法|卡码网94.城市间货物运输的思考】
数据结构·算法·图论·卡码网·bellman_ford·求最短路径