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

图的拓扑排序

拓扑排序是一种对有向无环图(Directed Acyclic Graph, DAG)进行排序的算法。在拓扑排序中,我们将图中的节点按照一定的顺序进行排序,使得对于图中的每一条有向边 (u, v) ,u 在排序中都出现在 v 之前。

拓扑排序的思想是通过不断删除入度为0的节点,直到所有节点都被删除或者剩下的节点都有入度大于0,从而得到一个拓扑排序的序列。

下面是使用C++实现拓扑排序的代码示例:

#include <iostream>
#include <vector>
#include <queue>using namespace std;vector<int> topologicalSort(vector<vector<int>>& graph) {int n = graph.size();vector<int> inDegree(n, 0); // 记录每个节点的入度vector<int> result; // 用于存储排序后的结果// 统计每个节点的入度for (int i = 0; i < n; i++) {for (int j = 0; j < graph[i].size(); j++) {inDegree[graph[i][j]]++;}}queue<int> q;// 将入度为0的节点加入队列for (int i = 0; i < n; i++) {if (inDegree[i] == 0) {q.push(i);}}// 拓扑排序while (!q.empty()) {int node = q.front();q.pop();result.push_back(node);// 更新与当前节点相邻节点的入度for (int i = 0; i < graph[node].size(); i++) {int neighbor = graph[node][i];inDegree[neighbor]--;if (inDegree[neighbor] == 0) {q.push(neighbor);}}}// 检查是否有环if (result.size() != n) {cout << "Graph contains a cycle!" << endl;return vector<int>();}return result;
}int main() {int n; // 节点个数int m; // 有向边的个数cout << "Enter the number of nodes: ";cin >> n;cout << "Enter the number of directed edges: ";cin >> m;vector<vector<int>> graph(n); // 定义有向图的邻接表表示cout << "Enter the directed edges: " << endl;for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;graph[u].push_back(v);}vector<int> result = topologicalSort(graph);cout << "Topological sort: ";for (int i = 0; i < result.size(); i++) {cout << result[i] << " ";}return 0;
}

在上面的代码中,我们首先输入了有向图的节点个数和有向边的个数。然后,我们通过邻接表的形式输入了有向边的信息。接下来,我们调用了 topologicalSort 函数对图进行拓扑排序,并将排序结果输出。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • RabbitMQ如何保证可靠性
  • 文档控件DevExpress Office File API v24.1 - 支持基于Unix系统的打印
  • 正则表达式扩展应用
  • Linux/C 高级——shell脚本
  • elasticsearch教程
  • 学习记录——day28 信号量集
  • 未来展望:PLC远程控制网关与工业物联网融合的发展趋势
  • 【Linux】系列入门摘抄笔记-4-查看文件内容命令cat/more/less/tail
  • web基础与http协议与配置
  • 美的神机后续
  • 【Datawhale AI夏令营第四期】 Datawhale AI夏令营第四期 魔搭-AIGC方向 Task01笔记
  • Android 文件上传与下载
  • 引导过程与服务控制
  • springbootAl农作物病虫害预警系统-计算机毕业设计源码21875
  • 数据库|SQLServer数据库:数据的基本查询
  • 230. Kth Smallest Element in a BST
  • C语言笔记(第一章:C语言编程)
  • Docker: 容器互访的三种方式
  • E-HPC支持多队列管理和自动伸缩
  • Java编程基础24——递归练习
  • Java面向对象及其三大特征
  • mongodb--安装和初步使用教程
  • Mysql优化
  • oschina
  • PV统计优化设计
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • windows下mongoDB的环境配置
  • 浮动相关
  • 聊聊sentinel的DegradeSlot
  • 前端js -- this指向总结。
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 我建了一个叫Hello World的项目
  • 移动端唤起键盘时取消position:fixed定位
  • 【云吞铺子】性能抖动剖析(二)
  • 7行Python代码的人脸识别
  • ​【已解决】npm install​卡主不动的情况
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 数仓建模:如何构建主题宽表模型?
  • #ifdef 的技巧用法
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $$$$GB2312-80区位编码表$$$$
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (第二周)效能测试
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (蓝桥杯每日一题)love
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (自适应手机端)行业协会机构网站模板
  • .NET Core 2.1路线图
  • .Net Core中Quartz的使用方法