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

这篇具有很好参考价值的文章主要介绍了搜索与图论第五期 拓扑序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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


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

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

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

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

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

二、例题

1.有向图的拓扑排序

搜索与图论第五期 拓扑序列,图论文章来源地址https://www.toymoban.com/news/detail-817550.html

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;
}

总结

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

到了这里,关于搜索与图论第五期 拓扑序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搜索与图论第六期 最短路问题

    Dijkstra算法是一种著名的图算法,主要用于求解有权图中的单源最短路径问题。它由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger Wybe Dijkstra)在1956年首次提出。Dijkstra算法的核心思想是通过以下步骤逐步构建最短路径树: 初始化:创建一个空白的最短路径字典,其中每

    2024年02月20日
    浏览(42)
  • 【算法基础:搜索与图论】3.3 拓扑排序

    https://oi-wiki.org/graph/topo/ 本文主要学习拓扑排序相关知识。 拓扑排序的英文名是 Topological sorting。 拓扑排序要解决的问题是给一个 有向无环图 的 所有节点排序 。 我们可以拿大学每学期排课的例子来描述这个过程,比如学习大学课程中有:程序设计,算法语言,高等数学,

    2024年02月16日
    浏览(48)
  • 搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

    往深里搜,搜到叶子结点那里,回溯,到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件(题目要求的东西) 3、每层都用循环判断是否存在可以dfs的路 输出数字组合 全排列的思想解决n皇后问题,用三个bool数组描述限制

    2024年02月19日
    浏览(46)
  • 一张图带你看完图论第五章(包含全部考点,含定义、定理、公式、推导证明和所有例题)

    付费大佬可以联系我把你们加入思维导图协作,看更加具体清楚地思维导图/敬礼 5.1 匹配 匹配(边独立集)M是G的不相邻边组成的边子集(无环) 饱和点 v是匹配M中某边的端点,则称v为M饱和点 完美匹配 G中每个顶点均为M饱和点,则M为G的完美匹配 最优匹配 在赋权完全偶图

    2024年02月09日
    浏览(54)
  • 搜索与图论 - 搜索与图在算法中的应用【中】

    目录 迪杰斯特拉算法Dijkstra  Dijkstra求最短路 I Dijkstra求最短路 II 贝尔曼-福特算法 bellman-ford 有边数限制的最短路 SPFA算法 spfa求最短路  spfa判断负环 Floyd Floyd求最短路   该算法不能存在负权边 思路: 初始化距离数组, dist[1] = 0, dist[i] = inf; for n次循环 每次循环确定一个min加

    2023年04月08日
    浏览(79)
  • 搜索与图论(三)

    朴素版Prim 一般用于稠密图 算法流程: 集合表示当前已经在连通块的点 1.初始化距离,把所有距离都初始化为正无穷 2.n次迭代,找到集合外距离最小的点 -t 3.用t来更新其它点到集合的距离 一般用于稀疏图 算法流程: 1.将所有边按照权重从小到大排序 2.枚举每一条边(a,b),权重为

    2024年02月14日
    浏览(32)
  • 三、搜索与图论

    树是一种特殊的图 存储可以用链式向前星或者vector 有向无环图也是拓扑图 入度:有多少条边指向自己 出度:有多少条边出去 入度为0就是起点,出度为0就是终点 帮助理解 Dijkstra求最短路 I Dijkstra求最短路 II 增加点权,求有多少条最短路 题目链接 增加边权,求花费最少 题

    2024年02月20日
    浏览(44)
  • 搜索与图论(一)

    DFS不具有最短性 一层一层搜索,可以搜到最短路。       适用于有向图  

    2024年02月15日
    浏览(33)
  • 搜索与图论(二)

    所有边权都是正数 朴素Dijkstra算法 基本思路: 从1号点到其他点的最短距离 步骤: 定义一个s集合包含当前已确定最短距离的点 1、初始化距离dis[1] = 0,dis[其它] = 正无穷 2、for i 0-n循环n次      2.1找到不在s中的距离最近的点 -t     2.2把t加到s当中去     2.3用t来更新其它点的距

    2024年02月14日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包