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

前言

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


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

拓扑排序

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

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

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

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

二、例题

1.有向图的拓扑排序

2.AC代码:

cpp 复制代码
//图的拓扑序列只针对有向图
//有向无环图被称为拓扑图
//一个点的入度是指有多少条边是指向自己
//一个点有几条边出去就是这个点的出度
//一个有向无环图一定至少存在一个入度为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;
}

总结

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

相关推荐
燃于AC之乐17 小时前
《算法实战笔记》第10期:六大算法实战——枚举、贪心、并查集、Kruskal、双指针、区间DP
算法·贪心算法·图论·双指针·区间dp·二进制枚举
北温凉19 小时前
EEG 有效连接分析(基于 MVGC 与图论)
图论·eeg·mvgc·脑功能连接
仰泳的熊猫19 小时前
题目1432:蓝桥杯2013年第四届真题-剪格子
数据结构·c++·算法·蓝桥杯·深度优先·图论
一条大祥脚2 天前
ABC357 基环树dp|懒标记线段树
数据结构·算法·图论
大闲在人2 天前
Mermaid vs Graphviz, 现代文档的“瑞士军刀”与 图论可视化的“学术基石”
图论
scx201310042 天前
20260129LCA总结
算法·深度优先·图论
Snow_day.2 天前
有关线段树应用(1)
数据结构·算法·贪心算法·动态规划·图论
Mr_Xuhhh4 天前
图的相关知识点总结
图论
充值修改昵称4 天前
数据结构基础:图论基础全面解析
数据结构·python·图论
檐下翻书1734 天前
招聘SOP流程图-泳道图模板详细教程
论文阅读·毕业设计·流程图·图论·论文笔记·毕设