数据结构——拓扑排序算法

2023-11-15

拓扑排序的深度优先算法(Topological Sort with Depth-First Search)是一种在有向无环图(DAG)中进行排序的方法。
。该算法使用递归来进行深度优先搜索,并在搜索完成后将节点添加到排序结果中。

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

class Graph {
private:
    int numVertices; // 图中节点的数量
    vector<vector<int>> adjacencyList; // 邻接表

public:
    Graph(int vertices) : numVertices(vertices) {
        adjacencyList.resize(vertices);
    }

    // 添加有向边
    void addEdge(int start, int end) {
        adjacencyList[start].push_back(end);
    }

    // 深度优先搜索拓扑排序算法
    void topologicalSortDFS(int vertex, vector<bool>& visited, stack<int>& result) {
        visited[vertex] = true;

        // 递归访问相邻节点
        for (int neighbor : adjacencyList[vertex]) {
            if (!visited[neighbor]) {
                topologicalSortDFS(neighbor, visited, result);
            }
        }

        // 将当前节点压入栈中
        result.push(vertex);
    }

    // 执行拓扑排序
    vector<int> topologicalSort() {
        vector<bool> visited(numVertices, false);
        stack<int> result;

        // 对每个未访问的节点执行深度优先搜索
        for (int i = 0; i < numVertices; ++i) {
            if (!visited[i]) {
                topologicalSortDFS(i, visited, result);
            }
        }

        // 从栈中提取排序结果
        vector<int> sortedResult;
        while (!result.empty()) {
            sortedResult.push_back(result.top());
            result.pop();
        }

        return sortedResult;
    }
};

int main() {
    Graph graph(6);

    graph.addEdge(5, 2);
    graph.addEdge(5, 0);
    graph.addEdge(4, 0);
    graph.addEdge(4, 1);
    graph.addEdge(2, 3);
    graph.addEdge(3, 1);

    vector<int> result = graph.topologicalSort();

    cout << "Topological Sort: ";
    for (int vertex : result) {
        cout << vertex << " ";
    }
    cout << endl;

    return 0;
}

拓扑排序的广度优先算法(Topological Sort with Breadth-First Search)是一种在有向无环图(DAG)中进行排序的方法。与深度优先算法不同,广度优先算法使用队列来实现拓扑排序。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

class Graph {
private:
    int numVertices; // 图中节点的数量
    vector<vector<int>> adjacencyList; // 邻接表

public:
    Graph(int vertices) : numVertices(vertices) {
        adjacencyList.resize(vertices);
    }

    // 添加有向边
    void addEdge(int start, int end) {
        adjacencyList[start].push_back(end);
    }

    // 拓扑排序算法
    vector<int> topologicalSort() {
        vector<int> inDegree(numVertices, 0); // 记录每个节点的入度
        queue<int> q; // 用于BFS的队列

        // 计算每个节点的入度
        for (int i = 0; i < numVertices; ++i) {
            for (int neighbor : adjacencyList[i]) {
                inDegree[neighbor]++;
            }
        }

        // 将入度为0的节点加入队列
        for (int i = 0; i < numVertices; ++i) {
            if (inDegree[i] == 0) {
                q.push(i);
            }
        }

        vector<int> result; // 用于存储排序结果

        // 执行广度优先搜索
        while (!q.empty()) {
            int current = q.front();
            q.pop();
            result.push_back(current);

            // 更新相邻节点的入度,并将入度为0的节点加入队列
            for (int neighbor : adjacencyList[current]) {
                inDegree[neighbor]--;
                if (inDegree[neighbor] == 0) {
                    q.push(neighbor);
                }
            }
        }

        return result;
    }
};

int main() {
    Graph graph(6);

    graph.addEdge(5, 2);
    graph.addEdge(5, 0);
    graph.addEdge(4, 0);
    graph.addEdge(4, 1);
    graph.addEdge(2, 3);
    graph.addEdge(3, 1);

    vector<int> result = graph.topologicalSort();

    cout << "Topological Sort: ";
    for (int vertex : result) {
        cout << vertex << " ";
    }
    cout << endl;

    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——拓扑排序算法 的相关文章

  • npm install -g @vue/cli 报错

    最近两天用 npm install g vue cli 之后 出大事了 npm 报错 重命名 超出最大调用栈 各种折腾 后来发现问题所在 今天写出来 一方面提醒自己 一方面利于他人 问题原因 公司给我们装的系统都是公司内部定制的系统 有些c

随机推荐

  • 【单片机毕业设计】温室大棚

    最近设计了一个项目基于单片机的大棚环境检测系统 与大家分享一下 一 基本介绍 项目名 大棚环境检测 项目编号 mcuclub hj 013 单片机类型 STC89C52 具体功能 1 通过DS18B20测量环境温度 超过上下限值进行加热制冷
  • 《机器学习(西瓜书)》读书笔记:第三章_线性模型

    线性模型虽说是机器学习中最简单的模型 但是还是有很多细小的知识点值得注意的 从去年这时候就开始接触机器学习 看过Ng在Coursera上的视频和斯坦福的cs229 这次看过西瓜书之后又加深了理解 于是赶紧趁热把思路整理出来 一 线性回归 线
  • Kong的跨域问题

    Kong的跨域问题 情景 原因 添加cors插件 情景 外网使用kong做网关 域名为demo com 本地有一个服务 域名为localhost 本地服务需要调用外网上的服务 出现跨域问题 而直接使用nginx的外网服务器没出现这个问题 原
  • linux搭建测试环境

    微信设置水滴昵称 个性中带点萌 Linux 测试环境搭建步骤 准备工具 SecureCRT工具 Linux工具 连接服务器 FTP传输工具 上传文件到服务器 MySQL连接工具 安装包 以下文件均为压缩包rpm格式和tar gz JDK1
  • 数据结构习题解析与实验指导-严蔚敏数据结构-第二章:线性表(刷题记录)

    目录 第二章 线性表 刷题记录 P 18 20 第一题 2022年4月7日 星期四 凌晨00 28 01 12 第二题 2022年4月7日 星期四 凌晨10 01 10 21 第三题 2022年4月7日 星期四 晚上23 21 23 31
  • 使用Docker-容器命令案例2

    案例 进入容器 修改文件 需求 进入Nginx容器 修改HTML文件内容 添加 传智教育欢迎您 提示 进入容器要用到docker exec命令 步骤 1 进入容器 进入我们刚刚创建的nginx容器的命令为 docker exec it mn
  • 最短路径——Dijkstra算法(C语言实现)

    最短路径 Dijkstra算法 基本概念 1 最短路径 非带权图 边数最少的路径 带权图 边上的权值之和最少的路径 基本思想 1 v 源点 S 已经生成最短路径的终点 w
  • Redis常用的五种数据类型

    Redis常用的五种数据类型 String Key Value String是最常用的一种数据类型 普通的key value存储都可以归为此类 一个Key对应一个Value string类型是二进制安全的 Redis的string可以包含任
  • 使用xshell6连接Linux服务器失败的原因

    1 我在使用xshell6连接到服务器上面发生了连接失败的问题 2 仔细分析了一下 可能存在的原因有 在虚拟机上没有连上网 所以首先要保证要连接上网 没有开启SSHD服务可以通过系统 gt 服务来查看是否启动了该服务 可以在命令行中输入se
  • 如何用python进行数据分析

    文章目录 前言 1 Python数据分析流程及学习路径 2 利用Python读写数据 3 利用Python处理和计算数据 4 利用Python分析建模 5 利用Python数据可视化 零基础Python学习资源介绍 Python学习路线汇总
  • DNS 预解析是什么?怎么实现?

    DNS优化 在介绍dns prefetch之前 先要提下当前对于DNS优化主流方法 一般来说 一次DNS解析需要耗费 20 120ms 所以为了优化DNS 我们可以考虑两个方向 减少DNS请求次数 缩短DNS解析时间dns prefetch
  • 网站服务器 80端口吗,你的服务器打开IIS80端口了吗?

    我是中国药都网的站长 做门户网站有二年了 也在A5上和大家分享了很多地方门户经验 今天继续在A5这个平台跟大家分享经验 这个网站我是从2009年做的 用了3次服务器 但是只有第三次用服务器打开了iis80端口并看到意向不到的效果 下面给大家
  • GEE学习笔记 五十五:GEE编辑器绘制样本点的一个bug(官方在5.1给出反馈已经修复相关bug)

    提交的Bug官方在5月1日已经给出反馈 测试发现已经修复了这个Bug 注释 这个是今天发现的一个bug 官方后续肯定会修复的 在做地物分类的时候我们会采用GEE在线采集样本方式 但是这个有一个问题需要注意 如果直接使用绘制矩形和点会将点变为
  • unity3D 下雨效果实现

    这个效果借鉴自unity例子angrybot 并做了一部分适应项目的修改 angrybot的实现方法 单个雨滴 RainBox 1 Start的时候从Mgr里面取一个雨滴的mesh给MeshFilter使用 2 在Update 做下落的循环
  • uniapp-历史搜索记录

    应用场景 很多搜索场景内都能用到这个功能 大概就是用户搜索了某个关键字 然后搜索的关键字可以持久的保存下来 下次打开搜索的时候可以达到快速点击搜索的效果 实现步骤 1 先给输入框双向绑定数据和事件
  • 生成式人工智能的潜在有害影响与未来之路(一)

    这是本文的第1版 反映了截至2023年5月15日 Generative AI的已记载的和预期的危害 由于Generative AI的发展 使用和危害的快速变化 我们承认这是一篇内在的动态论文 未来会发生变化 在本文中 我们使用一种标准格式来
  • 【观察】VMware:二十而冠,以梦为马不负韶华

    申耀的科技观察 读懂科技 赢取未来 今年7月 VMware首席执行官Pat Gelsinger成功登顶了世界七大高峰之一的乞力马扎罗山 期间的巨大挑战可想而知 但越困难越危险 也就越迷人 因为登顶的魅力 也是挑战自我 超越自我的过程 这似乎
  • idea添加自定义注释

    idea添加自定义注释 废话不多说 直接上图 1 设置Settings gt 编辑器Editor gt Live Templates 2 右侧加号 3 填写快捷缩写Abbreviation 描述Description 4 填写注释的内容 5
  • Nginx日志按日分割方法

    本文使用logrotate工具对Nginx日志进行按日的自动切割 操作系统为Centos7 6 步骤如下 1 编写针对Nginx的logrotate脚本如下 保存在 etc logrotate d usr local nginx logs
  • 数据结构——拓扑排序算法

    拓扑排序的深度优先算法 Topological Sort with Depth First Search 是一种在有向无环图 DAG 中进行排序的方法 该算法使用递归来进行深度优先搜索 并在搜索完成后将节点添加到排序结果中 include