搜索与图论-有向图的拓扑序列

news2024/9/23 19:19:33

文章目录

  • 一、有向图的拓扑序列
    • 1. 拓扑序列
    • 2. 拓扑排序
    • 3. 如何进行拓扑排序
    • 4. 拓扑排序具体实现详见例题有向图的拓扑序列
  • 二、有向图的拓扑序列例题——有向图的拓扑序列
    • 具体实现
      • 1. 样例演示
      • 2. 实现思路
      • 3. 代码注解
      • 4. 实现代码

一、有向图的拓扑序列

  • 有向图的拓扑序列就是图的广度优先遍历的一个应用。

1. 拓扑序列

  • 若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。(起点在终点的前面)
  • 拓扑序列是针对有向图,无向图是没有拓扑序列的。
  • 有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列。
  • 例如下图,由于 c 指向了 a ,所以该图不是拓扑序列。

在这里插入图片描述

  • 同样的例子,由于 d 指向了 b ,所以该图也不是拓扑序列。

在这里插入图片描述

2. 拓扑排序

  • 入度是指被其他点指向的数量。
  • 出度是指指向其他点的数量。
  • 举例说明:

在这里插入图片描述

  • 由上图可知,a 指向 b 和 c ,b 被 a 指向,并且指向 c ,c 被 a 和 b 指向。
  • 因此,a、b、c 的入度和出度分别为:
节点入度出度
a02
b11
c20
  • 因此,所有入度为 0 的点都可以作为起点。

3. 如何进行拓扑排序

  • 一个有向图,如果图中有入度为 0 的点,就把这个点删掉,同时也删掉这个点所连的边。
  • 一直进行上面处理,如果所有点都能被删掉,则这个图可以进行拓扑排序。
  • 一个拓扑序列可以有多种输出方式。
  • 举例说明:

在这里插入图片描述

  • 开始时,图是这样的状态,发现 A 的入度为 0,所以删除 A 和 A 上所连的边,结果如下图:

在这里插入图片描述

  • 这时发现 B 的入度为 0,C 的入度为 0,所以删除 B 和 B 上所连的边、 C 和 C 上所连的边,结果如下图:

在这里插入图片描述

  • 这时发现 D 的入度为 0,所以删除 D 和 D 上所连的边(如果有就删),结果如下图:

在这里插入图片描述

  • 这时整个图被删除干净,所有能进行拓扑排序。
  • 对上述过程的实现,可以通过 queue 队列实现,入队的点的顺序就是拓扑序列

4. 拓扑排序具体实现详见例题有向图的拓扑序列

二、有向图的拓扑序列例题——有向图的拓扑序列

题目描述

给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。
请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。
若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。

输入格式

第一行包含两个整数 n 和 m。
接下来 m 行,每行包含两个整数 x 和 y,表示存在一条从点 x 到点 y 的有向边 (x,y)。

输出格式

共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。
否则输出 −1。

数据范围

1 ≤ n,m ≤ 1e5

输入样例

3 3
1 2
2 3
1 3

输出样例

1 2 3

具体实现

1. 样例演示

  • 输入 n=3 和 m=3 。表示一个有 3 个点,3 条边。
  • 从 1 指向 2 。
  • 从 2 指向 3 。
  • 从 1 指向 3 。
  • 如下图所示。
    在这里插入图片描述

2. 实现思路

  • 首先记录各个点的入度。
  • 然后将入度为 0 的点放入队列。
  • 将队列里的点依次出队列,然后找出所有出队列这个点发出的边,删除边,同时边的另一侧的点的入度 -1。
  • 如果所有点都进过队列,则可以拓扑排序,输出所有顶点。否则输出 -1,代表不可以进行拓扑排序。

3. 代码注解

  • int h[N], e[N], ne[N], idx;表示邻接表的存储方式。
  • int d[N];表示点的入度。
  • int q[N];表示队列。
  • if(d[j]==0);如果点 j 的入度为零了,就将点 j 入队。
  • return tt==n-1;表示如果 n 个点都入队了话,那么该图为拓扑图,返回 true ,否则返回 false 。
  • 其他注解在实现代码当中体现。

4. 实现代码

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;

int n, m;
int h[N], e[N], ne[N], idx;  
int d[N];
int q[N];

void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx;
    idx ++;
}

//返回布尔序列是否存在, 若存在,则存储在q数组中
bool topsort()
{
    int hh = 0;
    int tt = -1;

    //遍历每一个节点, 入度为零则入队
    for (int i = 1; i <= n; i ++ )
    {
        if (!d[i])
        {
            tt ++;
            q[tt] = i;
        }
    }

    while (hh <= tt)
    {
        //队列不空,则取出头节点
        int t = q[hh];
        hh ++;

        //遍历头节点的每一个出边
        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (-- d[j] == 0)
            {
                tt ++; 
                q[tt] = j;
            }
        }
    }

    return tt == n - 1;
}

int main()
{
    cin >> n >> m;
    
    memset(h, -1, sizeof h);

    for (int i = 0; i < m; i ++ )
    {
        int a, b;
        cin >> a >> b;
        add(a, b);

        d[b] ++ ;
    }

    if (!topsort()) 
    {
        puts("-1");
    }
    else
    {
        for (int i = 0; i < n; i ++ )
        {
           cout << q[i] << " ";
        }
        puts("");
    }
    system("pause");
    return 0;
}

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

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

相关文章

遥感测深方法综述(二)CZMIL 机载LiDAR 测深系统

机载激光雷达测深测量是集激光测距、GNSS定位/姿态测量、航空摄影等多种技术于一体的新型主动机载激光测绘&#xff0c;可应用于海滩和海岸线、浅海编图、海岛、岛礁、水下障碍物的调查&#xff0c;是高效获取高精度近岸海底地形的重要技术&#xff0c;尤其对“人下不去、船上不…

31_ADC基本原理及单次采集实验

目录 ADC简介 STM32F10x ADC特点 ADC执行模式 相关寄存器及数据对齐方式 ADC的采样时间 常用库函数 单次转换一般步骤 实验源码 ADC简介 Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。…

Hylicos --- krprint实现

可变参函数的工作原理 函数调用时先用寄存器R0 ~R3 存放参数&#xff0c;如果不够放还要使用到堆栈&#xff0c;参数列表的形参从右到左依次入栈&#xff0c;弹栈时就是从左到右的顺序。 如果函数参数的个数固定&#xff0c;编译器就可以很清楚地在函数运行时依次从堆栈中弹出…

关于城市旅游的HTML网页设计 HTML+CSS上海博物馆网站 dreamweaver作业静态HTML网页设计 html网页制作期末大作业

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

JVM--这一篇就够了

1、JVM内存模型 Java内存模型是指Java虚拟机的内存模型&#xff0c;我们来看下Java内存模型的图片: 其中&#xff0c;在JAVA的JVM调优中&#xff0c;我们JAVA程序员需要重点关注的&#xff0c;首先是堆&#xff0c;我们看下堆内存的内存模型: 2、类的加载过程 (1)、加载 …

基于jsp+ssm的高速公路收费管理系统-计算机毕业设计

项目介绍 现阶段&#xff0c;政府都会对高速公路收费进行管理&#xff0c;用户通过进入相关系统对高速公路收费状况进行了解&#xff0c;简化了高速公路收费管理流程&#xff0c;进而提高政府高速收费管理效率&#xff0c;达到更好的管理目的。 本设计利用JSP作为开发语言。后…

Nature Communications:人类大脑的皮层下-皮层的动态状态及其在中风中的损伤

摘要 控制大脑自发活动中的动态模式的机制尚不清楚。在这里&#xff0c;我们提供的证据表明&#xff0c;在超低频率范围内&#xff08;<0.01-0.1Hz&#xff09;的皮层动力学需要完整的皮层-皮层下通信。利用静息态功能磁共振成像&#xff08;fMRI&#xff09;&#xff0c;我…

2021-2022 ICPC, NERC, Northern Eurasia Onsite L. Labyrinth

翻译&#xff1a; 莱斯利和利昂进入了一个迷宫。迷宫由&#x1d45b;大厅和&#x1d45a;大厅之间的单向通道组成。大厅编号从1到&#x1d45b;。 莱斯利和利昂在大厅开始了他们的旅程&#x1d460;。他们立刻争吵起来&#xff0c;决定各自去探索迷宫。然而&#xff0c;他们希…

分享一个你很可能不知道的Java异常实现的缺陷

前言 Java中一个大家熟知的知识点就是异常捕获&#xff0c;try…catch…finally组合&#xff0c;但是很多人不知道这里面有一个关于Java的缺陷&#xff0c;或者说是异常实现的一点不足之处。 我这边就通过一个很简单的实验给大家演示下效果玩玩儿&#xff0c;希望大家能觉得有趣…

linux搭建测试环境(tomcat)

安装jdk 1,查看是否装的有&#xff08;centos7会自带的有&#xff09;如果是普通用户切记要切换到root 输入命令查看是否安装&#xff1a; java -version2,跟踪查看自带jdk 默认安装了openjdk&#xff0c;那就要知道具体文件安装到哪里了&#xff0c;这里我们可以通过命令“rp…

黑马程序员Java数据结构与java算法笔记(1)

数据结构和算法详细内容 来源&#xff1a;黑马程序员Java数据结构与java算法 1.数据结构和算法概述 1.1什么是数据结构&#xff1f; 数据结构就是把数据元素按照一定的关系组织起来的集合&#xff0c;用来组织和存储数据 1.2数据结构分类 传统上&#xff0c;我们可以把数…

跟我学Python图像处理丨图像分类原理与案例

摘要&#xff1a;本篇文章将分享图像分类原理&#xff0c;并介绍基于KNN、朴素贝叶斯算法的图像分类案例。本文分享自华为云社区《[Python图像处理] 二十六.图像分类原理及基于KNN、朴素贝叶斯算法的图像分类案例丨【百变AI秀】》&#xff0c;作者&#xff1a;eastmount 。 一…

5-4:发送系统通知

触发事件 评论后&#xff0c;发布通知点赞后&#xff0c;发布通知关注后&#xff0c;发布通知。 处理事件 封装事件对象开发事件的生产者开发事件的消费者 消费者线程&#xff1a;从队列里读消息&#xff0c;并做处理&#xff1b; 生产者线程&#xff1a;往线程中存入数据&…

深度神经网络是什么意思,神经网络准确度只有50

1、研究人工神经网络的权值分布有什么意义 神经网络一般都是非常庞大的&#xff0c;每个边对应一个权值&#xff0c;如果权值不共享的话&#xff0c;数据量就更大了&#xff0c;但是为了提高效率&#xff0c;引入了权值共享&#xff0c;但是还不够&#xff0c;想再次提高效率和…

五、伊森商城 前端基础-Vue Vue脚手架创建 p26

目录 一、vue 模块化开发 1、全局安装 webpack 2、全局安装 vue 脚手架vue-cli 3、初始化 vue 项目 3.1、创建文件夹 3.2、初始化vue脚手架 3.3、项目结构 4、项目启动命令 拓展&#xff1a;创建超时 一、vue 模块化开发 打开终端&#xff0c;进行命令安装 1、全局安装…

Linux网络基础(初级)

Linux网络基础 文章目录Linux网络基础1.计算机网络的发展过程1.1 独立模式1.2 网络互联模式1.3 局域网 LAN1.4 广域网 WAN2.计算机网络协议2.1 协议的概念2.2 什么是网络协议2.3 什么是网络协议簇2.4 OSI 七层模型2.5 TCP/IP 五层模型3.网络传输基本流程3.1 同局域网内的两台主…

[附源码]计算机毕业设计拉勾教育课程管理系统Springboot程序

项目运行 环境配置&#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…

实例解析丨一文搞定GaussDB CM服务异常

摘要&#xff1a;本文主要为大家带来如何处理GaussDB CM服务异常问题。本文分享自华为云社区《【实例状态】GaussDB CM服务异常》&#xff0c;作者&#xff1a;酷哥。 首先确认是否是虚拟机、网络故障&#xff0c;底层故障处理 PID文件未清理导致进程启动失败 问题现象 收到…

FS2115D SOT23-6 低噪声3.3V升压IC电荷泵 DC/DC 转换器

概述 FS2115D 是一款低噪声、恒定频率 &#xff08;1.2MHz&#xff09; 开关电容倍压器。它从 1.8V 至 5V 输入产生一个稳定的输出电压&#xff0c;输出电流高达 150mA。FS2115D 的外部元件数量少&#xff08;VIN 和 VOUT 处有一个跨接电容器和两个小型旁路电容器&#xff09;…

程序员看世界杯

目录 1、世界杯赛事规则 1.1、赛制 1.2、小组赛 1.3、淘汰赛阶段 1.4、1/8决赛 1.5、半决赛 1.6、决赛 2、大力神杯材质 3、看球心德 4、2022大力神杯赢家 1、世界杯赛事规则 1.1、赛制 世界杯一共进行64场&#xff0c;其中分小组赛48场&#xff0c;1/8决赛8场&am…