当前位置: 首页 > news >正文

C++的算法:拓扑排序的原理及应用

        拓扑排序是对DAG(有向无环图)的顶点进行排序,使得对每一条有向边(u, v),均有u(在排序记录中)比v先出现。拓扑排序常用于任务调度、制定课程学习计划等问题中,以确保满足先决条件的任务或课程能够按顺序执行或学习。

        拓扑排序的常见算法有Kahn算法和DFS算法。其中,Kahn算法的基本思想是:

        1. 从DAG图中选择一个没有前驱(即入度为0)的顶点并输出。
        2. 从图中删除该顶点和所有以它为起点的有向边。
        3. 重复上述两步,直到当前的DAG图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。

        以下是一个使用Kahn算法实现拓扑排序的示例,代码如下。

#include <iostream>
#include <vector>
#include <queue>using namespace std;vector<int> topologicalSort(vector<vector<int>>& graph) {int numVertices = graph.size();vector<int> inDegree(numVertices, 0);for (const auto& neighbors : graph) {for (int neighbor : neighbors) {inDegree[neighbor]++;}}queue<int> q;for (int i = 0; i < numVertices; ++i) {if (inDegree[i] == 0) {q.push(i);}}vector<int> sortedOrder;while (!q.empty()) {int u = q.front();q.pop();sortedOrder.push_back(u);for (int v : graph[u]) {if (--inDegree[v] == 0) {q.push(v);}}}if (sortedOrder.size() != numVertices) {sortedOrder.clear(); // 如果存在环,清空结果}return sortedOrder;
}int main() {vector<vector<int>> graph = {{2, 3},{3},{3},{}};vector<int> sortedOrder = topologicalSort(graph);if (!sortedOrder.empty()) {cout << "拓扑排序: ";for (int vertex : sortedOrder) {cout << vertex << " ";}cout << endl;} else {cout << "图形包含循环,无法按拓扑进行排序." << endl;}return 0;
}

相关文章:

  • WWDC 2024前瞻:苹果如何用AI技术重塑iOS 18和Siri
  • VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版
  • dp+矩阵快速幂,CF551D. GukiZ and Binary Operations
  • 【数据分析基础】实验一 Python运算符、内置函数、序列基本用法
  • 什么时候用C而不用C++?
  • mysql当前状态分析(show status)
  • 吃星星(1.5)
  • 网页音频提取在线工具有哪些 网页音频提取在线工具下载
  • 转让无区域商业管理公司挺批行业包变更
  • Windows Server 2008 r2 + NAS
  • 介绍建造者模式
  • Hadoop的Windows环境准备
  • 超详解——识别None——小白篇
  • 『大模型笔记』什么是提示词注入(Prompt Injection)攻击?
  • Java 并发编程中的 synchronized 关键字及其现代优化技术
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【Linux系统编程】快速查找errno错误码信息
  • Android系统模拟器绘制实现概述
  • Java Agent 学习笔记
  • Javascript设计模式学习之Observer(观察者)模式
  • JavaScript新鲜事·第5期
  • JS字符串转数字方法总结
  • Laravel 菜鸟晋级之路
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Spark RDD学习: aggregate函数
  • tweak 支持第三方库
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 如何解决微信端直接跳WAP端
  • 入门到放弃node系列之Hello Word篇
  • 实习面试笔记
  • 通信类
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • Semaphore
  • ​Java基础复习笔记 第16章:网络编程
  • ​马来语翻译中文去哪比较好?
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # centos7下FFmpeg环境部署记录
  • (152)时序收敛--->(02)时序收敛二
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (SERIES12)DM性能优化
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (三)模仿学习-Action数据的模仿
  • (四)React组件、useState、组件样式
  • (转)Scala的“=”符号简介
  • . NET自动找可写目录
  • .equals()到底是什么意思?
  • .gitignore文件使用
  • .NET delegate 委托 、 Event 事件
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • :“Failed to access IIS metabase”解决方法
  • @DataRedisTest测试redis从未如此丝滑
  • @TableLogic注解说明,以及对增删改查的影响
  • [2016.7.Test1] T1 三进制异或