算法提升:图的拓扑排序算法

news2024/11/28 16:26:09

目录

概念

思路

代码


概念

拓扑序列:一些活动,其中某些活动必须在另一些活动完成之后才能开始,一定是无环的有向图,称为AOV网。

拓扑排序,其实就是对一个有向图构造拓扑序列的过程。构造时会有两个结果:如果此网的全部结点都被输出,则说明其为不存在环的AOV网。如果没有输出全部顶点数,则说明这个网存在回路,不是AOV网。

拓扑排序基本思路:从AOV网中选择一个入度为0的顶点输出,然后删去此结点,并删除以此结点为尾的弧,继续重复此步骤,直到输出全部顶点或者AOV网中不存在入度为0的顶点为止。

总结一下大概有如下特性:

  1. 拓扑排序排的是依赖关系,如果存在环形依赖就没有拓扑序;
  2. 入度为0的顶点不一定唯一,拓扑排序的结果不一定是唯一;
  3. 拓扑点值较大的点,在拓扑序中排在前面;

思路

如何用代码实现计算图的拓扑序呢?

  1. 给每一个点设置一个入度;
  2. 把入度为0的点删除掉,把和他关联的其他的点的入度 -1;
  3. 找到下一个入度为0的点,参考第二部;
  4. 直到所有的点都被删除掉
  5. 删除顺序就是拓扑序;

代码

//拓扑排序
void TopologicalSort2(GraphLnk *g){
    int n = g->NumVertices;
    
    //创建辅助数组
    int *count = (int *)malloc(sizeof(int)*n);
    assert(count != NULL);
    //初始化辅助数组
    for (int i = 0; i < n; i ++) {
        count[i] = 0;
    }
    
    //统计每个顶点的初始入度
    Edge *p;
    for (int i = 0; i < n; i ++) {
        p = g->NodeTable[i].adj;
        while (p != NULL) {
            //遍历本顶点的边列表,获取到边的另一个顶点的下标
            //则另一个顶点的入度加一
            count[p->dest] ++;
            p = p->Link;
        }
    }
    
    //初始化栈
    SeqStack stack;
    InitStack(&stack);
    for (int i = 0;  i < n; i ++) {
        //将初始时每个入度为0的顶点都入栈
        if (count[i] == 0) {
            //入栈
            Push(&stack, i);
        }
    }
    
    int v,w;
    //每个顶点依次出栈
    for (int i = 0; i < n; i ++) {
        if (IsEmpty(&stack)) {
            //在小于n时栈就空了,说明有回路
            printf("网络中有回路\n");
            return;
        }else{
            //获取栈顶元素
            GetTop(stack, &v);
            //栈顶元素出栈
            Pop(&stack);
            //访问本顶点
            printf("%2c",g->NodeTable[v].data);
            
            //删除所有以本顶点为结尾的弧->本顶点的所有邻接顶点入度减一
            //获取第一个邻接顶点
            w = GetFirstNeighbor(g, g->NodeTable[v].data);
            while(w != -1) {
                if (--count[w] == 0) {
                    //邻接顶点减一后入度为零,入栈
                    Push(&stack, w);
                }
                //获取下一个邻接顶点
                w = GetNextNeighbor(g, g->NodeTable[v].data, g->NodeTable[w].data);
            }
        }
    }
    
    free(count);
}

 

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

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

相关文章

Go中赋值和转换关系

Go中的赋值跟类型转换: 在java中反射是可以获取继承关系,而go语言实际是不支持继承的,所以必须是相同的类型才能使用AssignableTo(),ConvertibleTo() package mainimport ("fmt""reflect" )type User struct {Name string } func demo(){user:User{Name:…

C#语言实例源码系列-实现自定义屏保

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

Class文件结构

文章目录1.概述1.1 字节码文件的跨平台性1.2 Java的前端编译器1.3 透过字节码指令看代码细节2. 虚拟机的基石:Class文件3. Class文件结构3.1 魔数3.2 Class文件版本号3.3 常量池3.4 访问标识3.5 类索引、父类索引、接口索引集合3.6 字段表集合3.7 方法表集合3.8 属性表集合4. 使…

No.178# 混沌工程相关内容梳理

引言随着公司规模业务的快速增长&#xff0c;数以千计甚至万计的微服务&#xff0c;依赖的各类组件越来越多。分布式体系架构体系越来越复杂&#xff0c;没有任何一个人能够掌控所有复杂的耦合性。也就是说复杂性无法避免&#xff0c;不可能再回到单体应用&#xff0c;也无法彻…

西门子精彩触摸屏SMART V3组态配方的具体方法示例

西门子精彩触摸屏SMART V3组态配方的具体方法示例 本次和大家分享在精彩系列触摸屏中进行配方组态的具体方法,以下内容仅供大家参考: 如下图所示,首先,在连接中添加新的连接,这里以S7-200SMART为例,PLC和HMI的IP地址要设置在同一网段内, 如下图所示,在变量中,添加配…

【Java面试】来讲一讲你对String的理解

文章目录字符型常量和字符串常量的区别什么是字符串常量池&#xff1f;String 是最基本的数据类型吗String有哪些特性String为什么是不可变的&#xff1f;String真的是不可变的吗&#xff1f;String不可变的必要性是否可以继承 String 类数组有没有 length()方法&#xff1f;St…

windows线程 互斥锁CreateMutex、ReleaseMutex、CloseHandle

互斥 相关问题 多线程下代码或资源的共享使用。 互斥的使用 1.创建互斥 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全属性&#xff08;废弃参数&#xff0c;置NULL&#xff09; BOOL bInitialOwner,//初始的拥有者TRUE/FALSE LPCTSTR lpName //命名 );…

集成电路技术——如何制造芯片(1)

1.概述 电子工业是现在高新技术的核心&#xff0c;它在人类的科技发展中发挥了巨大作用&#xff0c;电子工业已经成为成为当今世界发展最快的高新技术产业&#xff0c;在全世界各国国民经济中起着举足轻重的作用。当今的电子技术离不开集成电路&#xff0c;集成电路是电子工业…

hadoop集群迁移

集群迁移 主要是要找到两个集群中active状态的namenode 集群迁移不同于服务器之间的文件发送&#xff0c;在hdfs中&#xff0c;文件是以块的形式&#xff0c;只可以通过namenode访问文件&#xff0c;所以迁移时需要通过hadoop命令 主要命令是distcp distcp有很多参数&#xf…

Kafka - 06 Kafka 集群环境搭建(三台服务器)

文章目录1. 克隆虚拟机2. Zookeeper 集群搭建3. Kafka 集群搭建4. 测试消息发送和消费1. 主题操作2. 生产者生产消息3. 消费者消费消息1. 克隆虚拟机 kafka集群搭建&#xff0c;需要3台虚拟机环境&#xff0c;但是我目前只安装了一台虚拟机&#xff0c;因此还需要准备两台虚拟…

[附源码]计算机毕业设计springboot-Steam游戏平台系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

纯CSS制作3D动态相册【流星雨3D旋转相册】HTML+CSS+JavaScriptHTML5七夕情人节表白网页制作

这是程序员表白系列中的100款网站表白之一&#xff0c;旨在让任何人都能使用并创建自己的表白网站给心爱的人看。 此波共有100个表白网站&#xff0c;可以任意修改和使用&#xff0c;很多人会希望向心爱的男孩女孩告白&#xff0c;生性腼腆的人即使那个TA站在眼前都不敢向前表白…

MySQL数据库管理及用户管理以及数据库用户授权

MySQL数据库管理及用户管理以及数据库用户授权MySQL数据库管理1、库和表2、常用的数据类型查看数据库结构SQL语句1、SQL语句分类&#xff1a;创建及删除数据库和表管理表中的数据记录&#xff08;表数据的增删改查&#xff09;向数据表中插入新的数据记录&#xff08;增&#x…

大二Web课程设计——动漫海贼王(可以很好的应付老师的作业)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

Java基础:入门程序、常量、变量

第一章 HelloWorld入门程序 1.1 程序开发步骤说明 Java程序开发三步骤&#xff1a;编写、编译、运行。 1.2 编写Java源程序 在D:\java\javaCode目录下新建文本文件&#xff0c;完整的文件名修改为HelloWorld.java&#xff0c;其中文件名为 HelloWorld&#xff0c;后 缀名必须…

音视频技术开发周刊 | 273

每周一期&#xff0c;纵览音视频技术领域的干货。新闻投稿&#xff1a;contributelivevideostack.com。「紧急通知」LiveVideoStackCon 2022 音视频技术大会北京站改期各位LVSer们&#xff1a;因疫情影响&#xff0c;北京近期不再允许举办大型线下活动&#xff0c;我们无奈且抱…

如何向瑞芯微平台添加驱动

如何向瑞芯微平台添加驱动驱动配置驱动文件放置配置相应的编译选项与设备树结合设备树配置以avafpga视频驱动为例&#xff1a;驱动配置 驱动文件放置 为了保证驱动文件能够被系统正确识别编译&#xff0c;需要将驱动文件的源文件avafpga.c放在./kernel/drivers/media/i2c/下 …

外观专利申请定要注意哪些因素呢?

问题一&#xff1a;申请外观专利需要提交哪些申请材料呢&#xff1f; 1、外观专利请求书&#xff1b; 2、外观设计七视图的照片或者设计图&#xff1b; 3、申请人的身份证明材料&#xff1b; 4、外观设计的简要说明材料。 问题二&#xff1a;外观专利申请定要注意哪些因素…

Automatic Online Calibration of Cameras and Lasers 论文翻译

目录题目AbstractI. INTRODUCTIONII. SENSOR PROCESSINGA. Image processingB. Laser processingIII. MISCALIBRATION DETECTIONIV. AUTOMATIC CALIBRATION TRACKINGV. EXPERIMENTAL RESULTSVI. CONCLUSION题目 Automatic Online Calibration of Cameras and Lasers 下载地址&…

C++ Reference: Standard C++ Library reference: Containers: list: list: size

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/size/ 公有成员函数 <list> std::list::size C98 size_type size() const; C11 size_type size() const noexcept; 返回大小 返回列表&#xff08;list&#xff09;容器中的元素个数。 形参 没有…