有向图的拓扑序列——拓扑排序

问题描述

什么是拓扑序列

  • 若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。
  • 图中不能有环
  • 图中至少存在一个点的入度为0

如何求拓扑序列?

  • 计算出每个节点的入度
  • 遍历每个节点,将入度为0的节点存入队列中
  • 每次从队头中取出一个元素,遍历当前元素指向的下一个节点,将下一个节点的入度减1,如果入度为0,那么将下一个节点插入队尾中
  • 直到队列中没有元素
  • 如果有n个节点插入过队列中,那么这个图存在拓扑序列,入队顺序就是拓扑序列

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int n, m;
int h[N], ne[N], e[N], idx;
int in[N];	// 存储当前节点的入度
int q[N];	// 数组模拟队列

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

void bfs()
{
	int hh = 0, tt = -1;	// 队列头、尾指针
	for(int i = 1; i <= n; i++)	// 将入度为0的节点插入队尾中
	{
		if(in[i] == 0) q[++tt] = i;
	}
	while(hh <= tt)
	{
		int t = q[hh++];	// 弹出队头元素
		for(int i = h[t]; i != -1; i = ne[i])	// 队头元素指向的下一个节点
		{
			int j = e[i];
			in[j]--;	// 入度减1
			if(in[j] == 0) q[++tt] = j;	// 入度为0,插入队尾中
		}
	}
	if(tt == n - 1)	// 如果队列中插入了n个节点(所有节点都入过队列),那么这个图有拓扑序列
	{
		for(int i = 0; i <= tt; i++) cout << q[i] << " ";
	}
	else cout << -1 << endl;
}

int main()
{
	cin >> n >> m;
	memset(h, -1, sizeof h);
	for(int i = 0; i < m; i++)
	{
		int a, b;
		cin >> a >> b;
		in[b]++;	// 将节点b入度+1
		add(a, b);
	}
	
	bfs();
	
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python编程工具】【ssh连接Docker容器】如何使用Docker容器里的python环境,如何调试在容器中的代码

文章目录 方案一览Gateway软件介绍启动容器配置apt源在容器中安装SSH服务器配置SSH服务器生成SSH密钥启动SSH服务为root创建密码连接到容器使用Gateway 方案一览 本篇博客将介绍如何在Docker容器中打开SSH连接服务&#xff0c;以及如何使用JetBrains Gateway软件进行代码调试。…

leetcode-hot100双指针专题

第一题&#xff1a;移动零 题目链接 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 解题思路 我们创建两个指针i,j&#xff0c;第一次遍历的时候指针j用来记录当前面有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪&#xff0c;第一次遍历完后&…

【网站项目】基于SSM的249作业提交与查收系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

企业AI应用开发:定制AI解决方案助力企业智能转型

随着人工智能技术的迅猛发展&#xff0c;越来越多的企业开始意识到人工智能在业务中的价值&#xff0c;并将其应用于实际场景中。而在人工智能应用开发领域&#xff0c;定制AI解决方案成为了企业智能转型的重要一环。 那么&#xff0c;什么是企业AI应用开发呢&#xff1f;简单…

java基础:随机生成几个整数存放到数组里并按顺序输出案例分析

思路分析 具体步骤如下&#xff1a; 创建一个数组&#xff0c;用于存放生成的随机数。 定义最大值和最小值&#xff0c;用于限定随机数的取值范围。 使用循环和Random类中的方法生成随机数&#xff0c;并将其添加到数组中。 使用Arrays类中的sort()方法对数组进行排序&#…

fcpx视频剪辑:Final Cut Pro for Mac 10.7.1中文版

Final Cut Pro是由苹果公司开发的一款专业视频编辑软件&#xff0c;主要用于影片的后期剪辑、调色、特效、音频处理等方面。 以下是Final Cut Pro的特点&#xff1a; 高效的视频编辑功能&#xff1a;Final Cut Pro提供了丰富的视频编辑工具&#xff0c;包括多轨道编辑、剪切、修…

apipost和curl收不到服务器响应的HTTP/1.1 404 Not Found

windows的apipost发送请求后&#xff0c;服务器响应了HTTP/1.1 404 Not Found&#xff0c;但是apipost一直显示发送中。 linux上的curl也一样。 使用wireshark抓包发现收到了响应&#xff0c;但是wireshark识别不了&#xff08;图中是回应404后关闭了连接&#xff09;&#xff…

Google翻译 替换插件 沉浸式翻译(放松一下)

下载地址 Greasy Fork - 安全、实用的用户脚本大全 安装后 测试 随便找一篇文章 点击右侧粉红标签图标 更多

基于云原生技术栈构建企业统一基础技术平台(总纲)

一、概述 本文主要介绍基于云原生技术栈建设企业技术平台的总纲&#xff0c;该技术平台对业务应用全生命周期进行管理和支撑&#xff0c;提供从需求交付、生产运行、稳定保障、资产运营&#xff0c;以及安全生产的体系化解决方案&#xff0c;为企业自建或采购技术平台提供参考。…

20240124-我的第一个知识星球

2024年01月25日22:50:04 家中 我在知识星球上创建了我第一个知识星球。事情是这样的: 去年搞完WHV之后,其实还是很受打击的,毕竟付出的辛苦没有得到相应的成绩,还是很失落的。但是那个时候失落没多久,想到要去小红书发帖子,把程序分享出去,我的程序不能白开发,我想让…

照片上的杂物怎么清除?这两个方法很好用

随着智能手机的普及和拍照技术的发展&#xff0c;我们经常会在社交媒体上分享自己的照片。然而&#xff0c;有时候拍摄的照片中会包含一些不必要的杂物&#xff0c;如电线、垃圾、阴影等&#xff0c;这些杂物会影响照片的美观度和视觉效果。这时候我们就需要借助工具来帮我们清…

DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior

DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior Abstract1. Introduction2. Relate work3. Methodology3.1 退化去除预训练3.2 利用生成先验进行图像重建3.3 保真度-真实性权衡的潜在图像引导 4. Experiments4.1 数据集、实现、度量4.2 与最先进方…

接口性能优化常见12式

目录 1.批处理 2.异步处理 3.空间换时间 4.预处理 5.池化思想 6.串行改并行 7.索引 8.避免大事务 9.优化程序结构 10.深分页问题 11.SQL优化 12.锁粒度避免过粗 1.批处理 批量思想&#xff1a;批量操作数据库&#xff0c;这个很好理解&#xff0c;我们在循环插入场…

github上传代码

github上传代码 分为三步&#xff1a; 1.在自己的github上找个放代码地方&#xff0c;比如创建一个仓库 2. 在该仓库中点击上传代码 3. 然后直接把代码拖拽过来或者点击choose your files&#xff0c;上传后点击一下commit即可 最后代码就可以上传上来啦 &#xff0c;如果想在该…

C++——函数

1&#xff0c;概述 函数的作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个模块实现特定的功能。 2&#xff0c;函数的定义 函数的定义一般主要有五个步骤&#xff1a; 1&#xff…

爬虫(一)

1. HTTP协议与WEB开发 1. 什么是请求头请求体&#xff0c;响应头响应体 2. URL地址包括什么 3. get请求和post请求到底是什么 4. Content-Type是什么1.1 简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于万维网&#xff08;…

金融OCR领域实习日志(一)——OCR技术从0到1全面调研

一、OCR基础 任务要求&#xff1a; 工作原理 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是指电子设备&#xff08;例如扫描仪或数码相&#xff09;检查纸上打印的字符&#xff0c;经过检测暗、亮的模式肯定其形状&#xff0c;而后用…

SRPC 框架服务端源码解析

0. RPC Context 保存某些必要的上下文信息&#xff1b; 某端独有功能&#xff1a;Client 获取请求成功或失败 1. RPCBuffer const 和 constexpr 变量的主要区别是&#xff1a;const 变量的初始化可以被推迟到运行期&#xff0c;constexpr 必须在编译期初始化&#xff1b;所…

OpenHarmony开发——GN快速上手

背景 最近在研究鸿蒙操作系统的开源项目OpenHarmony&#xff0c;该项目使用了GNNinja工具链进行配置&#xff0c;编译&#xff0c;于是开始研究GN如何使用。 本文的所有信息均来自GN官网和本人个人体会。 GN快速入门 使用GN GN的主要功能是根据配置文件&#xff08;.gn, BU…

Android开发--状态栏布局隐藏的方法

1.问题如下&#xff0c;安卓布局很不协调 2.先将ActionBar设置为NoActionBar 先打开styles.xml 3.使用工具类 package com.afison.newfault.utils;import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graph…