搜索与图论第五期 拓扑序列

news2024/9/30 23:30:11

前言

拓扑排序是非常重要的一部分,希望大家都能够手撕代码!!!(嘿嘿嘿)


一、拓扑排序定义(百度须知嘿嘿嘿)

拓扑排序
拓扑排序是一种对有向无环图(Directed Acyclic Graph,简称DAG)进行的排序过程,目的是将图中所有的顶点按照发生事件的顺序排成一条线性序列。这种排序确保了图中任意两个相邻顶点之间至少有一条边相连,且在这条边的方向上,这条边的终点在前于起点。拓扑排序的一个关键特性是,它只包含在一个顶点在其事件序列中出现的次数,这意味着每个顶点只会出现一次。

要执行拓扑排序,可以从DAG图的任一顶点开始,选择出度为0的顶点作为“根”,并将它们放入队列。然后,从队列中取出顶点,将其事件序列中的下一个顶点加入队列,同时移除与该顶点相关的所有边。这个过程会一直持续直到队列为空或者到达了一个没有前驱顶点的状态,此时就得到了该DAG的拓扑排序。

在实际应用中,拓扑排序可以用于确定哪些活动可以在给定的顺序下并发执行,因为只有那些在特定顺序下没有依赖关系的活动才能一起运行。例如,在AOV网中,如果没有回路,所有活动都可以按照拓扑序列排列,从而形成一个线性序列,使得每个活动的所有前驱活动都在其前面。1

总结来说,拓扑排序是一种用于确定有向无环图中顶点顺序的方法,确保每个顶点只出现一次,并且遵循特定的事件发生顺序。这种方法对于分析并发执行的活动顺序非常有用。

二、例题

1.有向图的拓扑排序

2.AC代码:

//图的拓扑序列只针对有向图
//有向无环图被称为拓扑图
//一个点的入度是指有多少条边是指向自己
//一个点有几条边出去就是这个点的出度
//一个有向无环图一定至少存在一个入度为0的点
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m;
int h[N], e[N], ne[N], idx;
int q[N], d[N];
//q是宽搜队列,d是这个点的入度

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

bool topsort() {
	int hh = 0, tt = -1;
	for (int i = 1; i <= n; i++)
		if (!d[i]) //如果这个点存在入度
			q[++tt] = i;//就把这个点加到队列里
	while (hh <= tt) {
		int t = q[hh++];//取出队头元素
		for (int i = h[t]; i != -1; i = ne[i]) {//拓展队头元素
			int j = e[i];//找到出边
			d[j]--;//删掉入边
			if (d[j] == 0) //如果这个点的入度全部被删掉了
				q[++tt] = j;//就让这个点入队
		}
	}
	//判断所有点是否已经全部入队
	return tt == n - 1; //返回队列里元素的数量是否等于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); //插入一条a->b的有向边
		d[b]++;//b的入度加一
	}
	if (topsort()) {//如果存在拓扑序
		for (int i = 0; i < n; i++)
			printf("%d ", q[i]);
		puts("");
	} else {
		puts("-1");
	}
	return 0;
}

总结

拓扑排序可能会经常用到,希望大家能够完全掌握!!!

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

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

相关文章

前后端分离,使用vue3整合SpringSecurity加JWT实现登录校验

前段时间写了一篇spring security的详细入门&#xff0c;但是没有联系实际。 所以这次在真实的项目中来演示一下怎样使用springsecurity来实现我们最常用的登录校验。本次演示使用现在市面上最常见的开发方式&#xff0c;前后端分离开发。前端使用vue3进行构建&#xff0c;用到…

ubuntu 安装protobuf

apt 安装 sudo apt install protobuf-compiler 编译安装 – 方式1 资料链接&#xff1a;ubuntu环境 安装ncnn_ubuntu ncnn_jbyyy、的博客-CSDN博客 git clone https://github.com/google/protobuf.git cd protobuf git submodule update --init --recursive ./autogen.sh …

如何在 Ubuntu 22.04 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 22.04 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈 介绍 “LAMP”堆栈是一组开源软件&#…

Unity 工厂方法模式(实例详解)

文章目录 在Unity中&#xff0c;工厂方法模式是一种创建对象的常用设计模式&#xff0c;它提供了一个接口用于创建对象&#xff0c;而具体的产品类是由子类决定的。这样可以将对象的创建过程与使用过程解耦&#xff0c;使得代码更加灵活和可扩展。 工厂模式的主要优点如下&…

一文了解Stream流(超详细+干货满满)

Stream流是对集合对象功能的增强&#xff0c;专注于对集合对象进行各种便利、高效的聚合操作或者大批量数据操作 //java.util.Collection.stream()方法用集合创建流 //Arrays.asList是将数组转化成List集合的方法 List<String> list Arrays.asList("hello",&…

LeetCode面试题02.07链表相交

力扣题目链接 思想&#xff08;数学&#xff09;&#xff1a;设链表A的长度为a&#xff0c;链表B的长度为b&#xff0c;A到交点D的距离为c&#xff0c;B到交点D的距离为d。显然可以得到两者相交链表的长度为&#xff1a;a - c b - d ,变换一下式子得到&#xff1a;a d b c…

Android学习之路(23)组件化框架ARouter的使用

一、功能介绍 支持直接解析标准URL进行跳转&#xff0c;并自动注入参数到目标页面中支持多模块工程使用支持添加多个拦截器&#xff0c;自定义拦截顺序支持依赖注入&#xff0c;可单独作为依赖注入框架使用支持InstantRun支持MultiDex(Google方案)映射关系按组分类、多级管理&…

应用层—HTTPS详解(对称加密、非对称加密、密钥……)

文章目录 HTTPS什么是 HTTPSHTTPS 如何加密HTTPS 的工作过程对称加密非对称加密 HTTPS 什么是 HTTPS HTTPS 也是一个应用层的协议。是在 HTTP 协议的基础上引入的一个加密层。 由来&#xff1a;HTTP 协议内容都是按照文本的方式明纹传输&#xff0c;这就导致在传输过程中出现…

重磅来袭“2024粤港澳电子展”覆盖电子信息完整产业链

2024年4月份粤港澳地区将举办一场规模盛大的电子信息产业博览会。这场展会占地面积高达10万平米&#xff0c;设立了多个展馆&#xff0c;涵盖了智慧家庭、新型显示、高端半导体、信创、大数据与存储、国防军工、人工智能、绿色消费电子、基础元器件等行业热点主题。 CITE品牌创…

开源运维监控工具Uptime Kuma本地部署并结合内网穿透实现公网访问

目录 主要功能 一、前期准备 本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。 本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma 三、实现公网查看网站监控 四、使用固定公网地址…

Pycharm连接远程服务器遇到的问题

文章目录 问题一 pycharm always "uploading pycharm helpers" to same remote python interpreter when starts问题二 [Errno 2] No such file or directory/root/miniconda3/bin/python: cant open file/root/. pycharm helpers/virtualenv-20. 24.5.pyz: 根据大佬…

终于把ESB升级说清楚啦!

我们先前已经介绍了iPaaS和API。本期我们将为大家介绍企业集成的重要工具之一——ESB。 【干货分享】终于有人把ESB升级说清楚啦&#xff01; ESB是什么&#xff1f; 随着信息化发展不断深入&#xff0c;企业在不同的阶段引入了不同的应用、系统和软件。这些原始的应用系统互不…

第04章_IDEA的安装与使用(下)(IDEA断点调试,IDEA常用插件)

文章目录 第04章_IDEA的安装与使用&#xff08;下&#xff09;8. 快捷键的使用8.1 常用快捷键8.2 查看快捷键1、已知快捷键操作名&#xff0c;未知快捷键2、已知快捷键&#xff0c;不知道对应的操作名 8.3 自定义快捷键8.4 使用其它平台快捷键 9. IDEA断点调试(Debug)9.1 为什么…

微信公众平台的四种账号类型比较分享

微信公众号对我们来说并不陌生&#xff0c;日常在使用微信的时候经常会刷到公众号文章。但是怎么去运营一个微信公众号又是另外一门学问&#xff0c;微信公众号和朋友圈不同&#xff0c;是个对外公开的个人主页。对于个人来说&#xff0c;可以用来输出一些内容分析&#xff1b;…

OpenHarmony驱动服务管理开发

驱动服务管理的开发包括驱动服务的编写、绑定、获取或者订阅&#xff0c;详细步骤如下。 驱动服务编写 // 驱动服务结构的定义 struct ISampleDriverService {struct IDeviceIoService ioService; // 服务结构的首个成员必须是IDeviceIoService类型的成员。int32_t (*S…

一些可能对开发三维引擎有帮助的图形学书籍列表

计算机图形学基础&#xff0c;第5版&#xff08;Fundamentals of Computer Graphics, 5th Edition&#xff09; 3D图形渲染手册&#xff1a;探索现代OpenGL和Vulkan的渲染算法的综合指南&#xff08;3D Graphics Rendering Cookbook: A comprehensive guide to exploring rende…

【H3C】配置AAA认证和Telnet远程登陆,S5130 Series交换机

AAA配置步骤为&#xff1a; 1.开启telent远程登陆服务 2.创建用户&#xff0c;设置用户名、密码、用户的服务类型 3.配置终端登录的数量 4.配置vlan-if的ip地址&#xff0c;用来远程登陆 5.允许对应的vlan通过 1.开启telent远程登陆服务 sys …

代码随想录算法训练营第27天 | 39.组合总和 + 40.组合总和II + 131.分割回文串

今日任务 39. 组合总和 40.组合总和II 131.分割回文串 39.组合总和 - Medium 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中…

数据结构二:线性表之顺序表(不定长顺序表)的设计与实现

本篇博客详细总结数据结构中的第一种结构:线性表之不定长顺序表&#xff0c;主要从以下几个方面梳理&#xff1a;线性表的定义、顺序表的概念、顺序表的基本操作&#xff1a;增删改查的基本思想及代码实现、基本操作的算法效率分析(时间复杂度和空间复杂度)、顺序表的优缺点适用…

曲线生成 | 图解三次样条曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是样条&#xff1f;2 三次样条曲线原理2.1 曲线插值2.2 边界条件2.3 系数反解 3 算法仿真3.1 ROS C仿真3.2 Python仿真3.3 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细…