拓扑排序算法

拓扑排序算法

在这里插入图片描述
上图意思为在我想要完成C7这件事之前我必须先完成事件C1,在完成C5这件事之前我必须先完成事件C6和C3.由图可以提看出拓扑序列是不唯一的。

有向图拓扑排序算法基本步骤:

1.从图中选择一一个入入度为0的顶点, 输出该顶点;
2.从图中删除该顶点及其相关联的弧;
3.重复执行1、2,直到不存在入度为0的顶点为止:
4.若输出的顶点数小于有向图中的顶点数,则输出“有回路信息”,否则输出顶点序列就是一组拓扑序列。

可以证明,任何一个无环有向图(AOV网),其全部顶点都可以排成一个拓扑序列。而且其拓扑序列不一定是唯一的。拓扑排序可以用来判断一个有向图是否有环。

算法实现

(a)数据结构,dui表示顶点i的入度,q为队列(如果要输出相同条件下结点编号小的在前(后)的序列,则需要使用优先队列)
(b)扫描有向图,将入度为0的点入队
©while(队非空)获取队首元素,假设为a,输出该元素,并出队;计数器cnt++;删除以a的出边,将出边对应的顶点的入度都减一;
(d)如果cnt==n,说明输出的序列为合法的拓扑序列,如果cnt!=n,说明该有向图存在环。

家谱树

原题目:有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。
【输入格式】
第1行一个整数N(1<=N<=100),表示家族的人数
接下来N行,第i行描述第i个人的儿子。
每行最后是0表示描述完毕。
【输出格式】
输出一个序列,使得每个人的后辈都比那个人后列出。
如果有多解输出任意一解。
【输入样例】
5
0
4 5 1 0
1 0
5 3 0
3 0
【输出样例】
2 4 5 3 1

分析

题目的辈分关系图
在这里插入图片描述
我们很容易想到使用拓扑排序来求解

代码如下:

#include<bits/stdc++.h>
using namespace std;#define int long long  // 使用 long long 类型,定义别名 int 为 long long,便于处理大数
const int N = 1e6 + 10;  // 定义常量 N 表示最大节点数
const int M = 1e6 + 10;  // 定义常量 M 表示最大边数// 定义结构体 E 表示边,存储目标节点和边的权重(w 没有使用)以及下一条边的下标
struct E {int to, w, next;
} e[M];int tot, head[N];  // tot 表示边的计数器,head[] 数组表示每个节点的边链表头指针
int n;  // n 表示图中节点的个数
int du[N];  // du[] 存储每个节点的入度// 初始化函数,初始化边和节点信息
void init() {tot = 0;  // 初始化边的计数器为0memset(head, -1, sizeof(head));  // 初始化 head 数组为 -1,表示当前没有边
}// 添加边函数,将从节点 u 到节点 v 的边加入图中
void addEdge(int u, int v) {e[tot].to = v;  // 边的目标节点为 ve[tot].next = head[u];  // 当前 u 节点的头指针指向的边作为下一条边head[u] = tot;  // 更新 u 节点的头指针,指向最新加入的这条边tot++;  // 边的计数器加 1
}// 输出图中所有边的函数,按节点顺序输出所有与之相连的边
void output() {for (int i = 1; i <= n; i++) {  // 遍历每个节点for (int j = head[i]; j != -1; j = e[j].next) {  // 遍历每条边int v = e[j].to;  // 获取边的目标节点cout << i << " " << v << endl;  // 输出该边的信息}}
}
// 主函数
signed main() {cin >> n;  // 读入节点数init();  // 初始化图queue<int> q;  // 定义一个队列,用于拓扑排序for (int i = 1; i <= n; i++) {  // 对每个节点 i 进行输入int v;  // 定义变量 v,表示当前输入的目标节点while (cin >> v && v) {  // 连续读入节点的邻接节点 v,直到输入 0 结束addEdge(i, v);  // 添加从节点 i 到 v 的边du[v]++;  // 增加 v 节点的入度}}// 将所有入度为 0 的节点入队列for (int i = 1; i <= n; i++) {if (du[i] == 0) {  // 如果 i 节点入度为 0q.push(i);  // 将 i 节点入队列}}// 进行拓扑排序while (!q.empty()) {  // 当队列不为空时,继续循环int t = q.front();  // 获取队列的第一个节点q.pop();  // 弹出队列中的节点cout << t << " ";  // 输出节点 tfor (int j = head[t]; j != -1; j = e[j].next) {  // 遍历 t 节点的所有邻接边int x = e[j].to;  // 获取边的目标节点 xdu[x]--;  // 将 x 节点的入度减 1if (du[x] == 0) {  // 如果 x 节点的入度变为 0q.push(x);  // 将 x 节点入队列}}}return 0;
}

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

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

相关文章

MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例

目录 深入理解 JavaScript 中的 MutationObserver&#xff1a;原理与实战案例 一、MutationObserver 简介 二、MutationObserver 的工作原理 1、基本用法 2、observe 方法的配置项 三、实战案例 案例 1&#xff1a;监控动态内容加载 案例 2&#xff1a;监控属性变化 案…

springboot 项目获取 yaml/yml (或 properties)配置文件信息

文章目录 springboot 项目获取配置文件信息前言1、 Autowired 注入 Environment类2、基础用法&#xff0c;使用Value注解直接注入配置信息3、进阶方法&#xff08;推荐使用&#xff09;拓展&#xff1a;springboot 集成配置中心 - 以 Apollo 为例 springboot 项目获取配置文件信…

通信工程学习:什么是接入网(AN)中的TF传送功能

接入网&#xff08;AN&#xff09;中的TF传送功能 在通信工程中&#xff0c;TF&#xff08;Transfer Function&#xff09;传送功能是指为接入网&#xff08;AN&#xff09;不同位置之间提供通道和传输介质&#xff0c;以实现数据的有效传输。以下是关于TF传送功能的详细解释&a…

PMP--一模--解题--91-100

文章目录 13.干系人管理91、 [单选] 在项目执行期间&#xff0c;一名外部干系人反对一项重大范围变更。除非重新评估干系人的决定&#xff0c;否则项目进展将受到影响。项目经理下一步该怎么做&#xff1f; 5.范围管理92、 [单选] 一客户给你一复杂项目的采购工作说明书&#x…

配置全新服务器深度学习一套流程

目录 1.安装anaconda2.配置cuda3.配置cudnn4.配置新的pytorch环境5.安装rdkit包6.小问题记录 1.安装anaconda 直接参考视频 总结&#xff1a; 1.下载anaconda安装包&#xff0c;尽量不下载最新的版本 2.bash 对应安装包&#xff0c;一直回车&#xff0c;yes 3.配置环境vim ~/.…

实战千问2大模型第三天——Qwen2-VL-7B(多模态)视频检测和批处理代码测试

画面描述:这个视频中,一位穿着蓝色西装的女性站在室内,背景中可以看到一些装饰品和植物。她双手交叉放在身前,面带微笑,似乎在进行一场演讲或主持活动。她的服装整洁,显得非常专业和自信。 一、简介 阿里通义千问开源新一代视觉语言模型Qwen2-VL。其中,Qwen2-VL-72B在大…

在k8s中,客户端访问服务的链路流程,ingress--->service--->deployment--->pod--->container

ingress是一个API资源。 其核心作用是nginx网页服务器。 当客户端访问服务器不同的url时, 用不同的location提供服务。 在k8s之外&#xff0c;nginx的配置一般如下&#xff1a; http {server {listen 80;server_name localhost;location / {root html; …

鸿蒙开发入门day19-使用NDK接口构建UI(一)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;还请三连支持一波哇ヾ(&#xff20;^∇^&#xff20;)ノ&#xff09; 目录 NDK接口概述 整体架构 开发流程 接入ArkTS页面 占位组件 NDK组…

unity3d入门教程六

unity3d入门教程六 15.1预制体15.2编辑预制体15.3在场景中编辑15.4动态创建实例15.5实例的销毁16.1&#xff08;练习&#xff09;子弹发射16.2定时器16.3键盘事件 15.1预制体 火神山10天建成&#xff0c;使用了预制体技术 一个个小房间都是事先建造好的&#xff0c;最后吊车装…

ICPC网络赛 以及ACM训练总结

一、训练反思 关于我自己暑假期间训练的反思&#xff0c;我承认无论是因为什么原因&#xff0c;我自己浪费我整整一个暑假的时间&#xff0c;暑假期间正是我们集训的关键时期&#xff0c;这期间没有任何的事情来打扰我们学习&#xff0c;而我却熬夜&#xff0c;白天训练懈怠&a…

在服务器上开Juypter Lab教程(远程访问)

在服务器上开Juypter Lab教程&#xff08;远程访问&#xff09; 文章目录 在服务器上开Juypter Lab教程&#xff08;远程访问&#xff09;一、安装anaconda1、安装anaconda2、提权限3、运行4、同意协议5、安装6、是否要自动初始化 conda7、结束8、检查 二、Anaconda安装Pytorch…

python 自动化测试接口

比如我们要测试接口&#xff1a;identity/chatRecords/pages 已在Postman中有&#xff0c;那我们就可以直接从里面复制出Python脚本 新建&#xff1a; pagerequest.py import requests import jsonurl "http://192.168.31.132:70/identity/chatRecords/pages"payl…

基于AgentUniverse在金融场景中的多智能体应用探索

基于AgentUniverse在金融场景中的多智能体应用探索 1.基于大模型智能体超级状态机 智能体、多智能体都是当下的技术热点,但作为一个技术人应该理解,所有的技术都有自己所针对的问题、及其能力边界,并不存在普适的、放诸业务场景皆 work 的技术方案。在这里尝试区分,从大模…

[数据集][目标检测]高铁受电弓检测数据集VOC+YOLO格式1245张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1245 标注数量(xml文件个数)&#xff1a;1245 标注数量(txt文件个数)&#xff1a;1245 标注…

2024年华为9月4日秋招笔试真题题解

2024年华为0904秋招笔试真题 二叉树消消乐好友推荐系统维修工力扣上类似的题--K站中转内最便宜的航班 二叉树消消乐 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树&#xff0c;二叉树节点的值范围为[1,1000]&#xff0c;二叉树的深度不超过1000)&#xff0c…

线性表之单链表

在上一节我们学习了线性表中的顺序表&#xff0c;今天我们来学习一下线性表中的另一种结构——单链表 前言 我们在之前已经初步了解了数据结构中的两种逻辑结构&#xff0c;但线性结构中并非只有顺序表一种&#xff0c;它还有不少兄弟姐妹&#xff0c;今天我们再来学习一下单链…

Python基础语法(3)下

列表和元组 列表是什么&#xff0c;元组是什么 编程中&#xff0c;经常需要使用变量&#xff0c;来保存/表示数据。变量就是内存空间&#xff0c;用来表示或者存储数据。 如果代码中需要表示的数据个数比较少&#xff0c;我们直接创建多个变量即可。 num1 10 num2 20 num3…

[数据集][目标检测]葡萄成熟度检测数据集VOC+YOLO格式1123张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1123 标注数量(xml文件个数)&#xff1a;1123 标注数量(txt文件个数)&#xff1a;1123 标注…

【重学 MySQL】二十九、函数的理解

【重学 MySQL】二十九、函数的理解 什么是函数不同 DBMS 函数的差异函数名称和参数功能实现数据类型支持性能和优化兼容性和可移植性 MySQL 的内置函数及分类单行函数多行函数&#xff08;聚合函数&#xff09;使用注意事项 什么是函数 函数&#xff08;Function&#xff09;在…

秋韵虫趣.

文章目录 虫鸣概览虫坛文化蟀种纷呈中华蟋蟀宁阳蟋蟀刻点铁蟋长颚斗蟋 油葫芦棺头蟋中华灶蟋小素蟋树皮蟋蟀 花生大蟋斑腿针蟋其他鸣虫树蟋&#xff0c;又名竹蛉、邯郸梨片蟋&#xff0c;又名金钟、天蛉、绿蛣蛉、银琵琶凯纳奥蟋&#xff0c;又名石蛉&#xff0c;鳞蟋黄蛉蟋&am…