图-拓扑排序

news2024/10/11 9:28:32

拓扑排序详细步骤

1. 入度统计

  • 首先,为每个顶点计算入度。入度是指有多少条边指向该顶点。
  • 在邻接矩阵中,如果存在 g.Edge[i][j] == 1,则表示有一条从顶点 i 指向顶点 j 的有向边。
  • 在遍历所有边时,针对每个目标顶点 j,对其入度 inDegree[j] 进行累加。

2. 初始化栈

  • 创建一个空栈 st
  • 遍历所有顶点,将所有入度为0的顶点入栈。入度为0的顶点表示没有其他顶点指向它,因此可以安全地被访问。

3. 执行拓扑排序

  • 进入一个循环,直到栈为空。
  • 在每次循环中,执行以下步骤:
    1. 弹出栈顶元素:从栈中取出一个顶点 v,这是当前要处理的顶点。
    2. 访问和输出顶点:打印或记录这个顶点。这部分就是拓扑排序的结果之一。
    3. 更新相邻顶点的入度
      • 使用一个函数(如 getFirstNeighbor)获取与顶点 v 相连的第一个邻接顶点 w
      • 如果找到了相邻顶点 w,则进入一个循环,持续查找所有与 v 相连的顶点:
        • 对于每个相邻顶点 w,将其入度减1(--inDegree[w])。
        • 检查减1后的入度
          • 如果 inDegree[w] 变为0,说明没有其他顶点指向 w,此时可以将 w 入栈,表示它也可以被安全访问。
        • 使用另一个函数(如 getsecondNode)找到下一个与 v 相连的顶点,继续这个过程,直到没有更多的相邻顶点可供处理。

4. 重复直到栈为空

  • 当栈为空时,所有可以访问的顶点都已经被访问过,拓扑排序完成。

注意事项

  • 图的特性:拓扑排序仅适用于有向无环图(DAG)。如果图中存在环,则无法完成拓扑排序,因为可能无法找到入度为0的顶点。
  • 输出顺序:输出的顺序代表了拓扑顺序,即在图中,如果存在一条边 u -> v,那么 u 必须在 v 之前被访问。
// 拓扑排序
using namespace std;
#include <stack>

int inDegree[MAX_VERTX_SIZE] = { 0 }; // 存储顶点的入度

void topSort(GraphMtx &g)
{
    // 统计每个顶点的入度
    for (int j = 0; j < MAX_VERTX_SIZE; j++)
    {
        for (int i = 0; i < MAX_VERTX_SIZE; i++)
        {
            if (g.Edge[i][j] == 1) // 如果存在边i->j
                inDegree[j]++;   // 增加顶点j的入度
        }
    }

    // 建立栈
    stack<int> st;

    // 第一次把入度为0的元素入栈
    for (int i = 0; i < g.NumV; i++)
    {
        if (inDegree[i] == 0) // 检查入度是否为0
            st.push(i);       // 如果是,将其入栈
    }

    // 排序输出栈顶点
    for (int i = 0; i < g.NumV; i++)
    {
        int v = st.top(); // 提取栈顶元素
        st.pop();         // 从栈中弹出顶点
        printf("%d", g.VList[v]); // 访问并打印该元素

        // 把访问完之后相关联的顶点入度-1
        int w = getFirstNeighbor(g, g.VList[v]); // 得到连接的第一个节点

        // 如果有连接的顶点,入栈,并查找下一个
        while (w != -1) // 当还有相邻的顶点
        {
            if (--inDegree[w] == 0) // 入度减1后判断是否为0
            {
                st.push(w); // 如果入度为0,重新入栈
            }
            // 查找与v相连的下一个节点
            w = getsecondNode(g, g.VList[v], g.VList[w]); // 不断查找下一个
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(基础)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;基础&#xff09; 简介适用场景Quartz核心概念Quartz 存储方式Quartz 版本类型引入相关依赖开始集成方式一&#xff1a;内存方式(MEMORY)存储实现定时任务1. 定义任务类2. 定…

高亚科技助力优巨新材,打造高效数字化研发项目管理平台

近日&#xff0c;中国企业管理软件资深服务商高亚科技与广东优巨先进新材料股份有限公司&#xff08;以下简称“优巨新材”&#xff09;正式签署合作协议&#xff0c;共同推进产品研发管理数字化升级。此次合作的主要目标是通过8Manage PM项目管理系统&#xff0c;提升优巨新材…

使用IDEA启动项目build时,解决Java编译时内存溢出问题:OutOfMemoryError深入解析

文章目录 简介问题描述解决方案常见解决方案示例代码示例1&#xff1a;增加JVM堆内存代码示例2&#xff1a;检查并修复内存泄漏代码示例3&#xff1a;分批编译代码示例4&#xff1a;使用编译器参数减少内存使用代码示例5&#xff1a;升级编译器和库 结论进一步的资源 简介 在J…

【Vue】Vue扫盲(三)计算属性和监听器

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 【Vue】Vue扫盲&#xff08;二&#xff09;指令&#xff1a;v-for 、v-if、v-else-if、v-else、v-show 文章目录 1、 计算属…

史上最全C语言static与extern指南

一、引言 在C语言中&#xff0c;static和extern关键字是非常重要的&#xff0c;它们分别用于控制变量的作用域和生命周期&#xff0c;以及变量和函数的定义和声明。理解这些关键字如何工作对于编写清晰、高效的代码至关重要。 二、static关键字 static关键字用于声明变量或函…

背靠背 丢包问题分析

存在一个设计需求&#xff0c;原始数据不足满字节有效的&#xff0c;要将数据整体右移对齐后输出。 整体移位后&#xff0c;存在eop 前移一拍情况。 实际分析时&#xff0c;因为是做数据裁剪&#xff0c;不会出现带宽膨胀问题&#xff08;1拍需要多拍出&#xff09;。 最…

关于摩托车一键启动无钥匙进入、智能科技创新

摩托车一键启动无钥匙进入功能 一、工作原理 摩托车的一键启动无钥匙进入功能采用了世界最先进的RFID无线射频技术和最先进的车辆身份编码识别系统&#xff0c;率先应用小型化、小功率射频天线的开发方案&#xff0c;并成功融合了遥控系统和无钥匙系统&#xff0c;沿用了传统…

基于Springboot+Vue的线上一流课程教学辅助系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 在系统…

01 为什么要学习数据结构与算法

为什么要学习数据结构与算法 一、问题提出 ​ 最早计算机的设计初衷主要用于军事上枪炮的弹道计算和火力表的测试&#xff0c;后来更多的用于科学计算&#xff0c;即数值类的计算&#xff0c;而现在&#xff0c;计算机深入到日常生活的各个方面&#xff0c;其计算的数据早已从…

【论文阅读】Cross Attention Network for Few-shot Classification

用于小样本分类的交叉注意力网络 引用&#xff1a;Hou, Ruibing, et al. “Cross attention network for few-shot classification.” Advances in neural information processing systems 32 (2019). 论文地址&#xff1a;下载地址 论文代码&#xff1a;https://github.com/bl…

畅阅读微信小程序+ssm论文源码调试讲解

2 系统开发环境 2.1微信开发者工具 微信开发者工具现在已经被小程序开发团队开发运行&#xff0c;目前微信开发者工具任然在不断的完善中&#xff0c;在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具&#xff0c;开发者工具将使用这个微信帐号的信息进行小程…

【含文档】基于Springboot+Vue的母婴全程服务管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

CSS @规则(At-rules)系列详解___@charset规则使用方法

CSS 规则(At-rules)系列详解 ___charset规则使用方法 本篇目录&#xff1a; 零、时光宝盒 一、charset规则定义和用法 二、CSS charset语法 三、charset 使用方法例子 1、正确使用方法 2、无效的&#xff0c;错误的使用方法 零、时光宝盒 &#xff08;https://blog.csd…

解决 IntelliJ IDEA 运行时 “Command line is too long“ 问题

文章目录 文章标题&#xff1a;解决 IntelliJ IDEA 运行时 "Command line is too long" 问题简介问题描述解决方案代码示例代码示例1&#xff1a;使用JAR Manifest代码示例2&#xff1a;使用Classpath File代码示例3&#xff1a;优化项目依赖 结论进一步的资源 文章标…

【算法】滑动窗口(续)

一、将x减到0的最小操作数 1658. 将 x 减到 0 的最小操作数 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要…

如何使用 Hailuo AI 生成视频

在这个科技飞速发展的时代&#xff0c;人工智能已经成为创意领域的重要工具。Hailuo AI 是一个强大的平台&#xff0c;可以帮助你将文字描述转化为高质量的视频。以下是详细的步骤&#xff0c;教你如何使用 Hailuo AI 生成视频。 第一步&#xff1a;访问 Hailuo AI 网站 首先…

第十四章 Java多线程--阻塞队列--SynchronousQueue

目录 一、SynchronousQueue基础概念 主要特点 使用场景 示例代码 二、SynchronousQueue深入了解 1 SynchronousQueue介绍 2 SynchronousQueue核心属性 3 SynchronousQueue的TransferQueue源码 3.1 QNode源码信息 3.2 transfer方法实现 3.3 tansfer方法流程图 一、Sy…

【C++堆(优先队列)】1834. 单线程 CPU|1797

本文涉及知识点 C堆(优先队列) LeetCode1834. 单线程 CPU 给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务…

QStandardItemModel的role

QStandardItemModel定义了一些标准的角色&#xff0c;而QAbstractItemModel允许自定义角色。以下是一些常见的数据角色&#xff1a;1. **Qt::DisplayRole**&#xff1a;这是最基本的角色&#xff0c;用于显示在视图中的文本。当一个单元格被绘制时&#xff0c;通常会查询这个角…

Go 语言应用开发:从入门到实战

Go 语言应用开发&#xff1a;从入门到实战 引言 Go&#xff08;Golang&#xff09;是由 Google 开发的一种开源编程语言&#xff0c;设计初衷是提高编程效率&#xff0c;尤其是在高并发场景下表现出色。Go 语言以其简洁、易学、高效并发的特性&#xff0c;逐渐成为开发者的首…