C++图论基础拓扑排序算法流食般投喂

声明:以下知识相关资料来自比特官网和小编手搓~


有向无环图的概念:

顾名思义,首先就是一个有向图,其次就是这个有向图里面不存在回路(环)。


AOV网的概念:

就类似于一门系统课,他课程的设计肯定是合理的,有简单到难,知识深度层层递进的,每一门课程都有优先级,学完他,在学她。

在这种有向图中,用顶点表示活动,用有向边<Vi, Vj>表示活动Vi必须先于活动Vj举办,这种有向图叫做顶点表示活动的网络,简称AOV网(Activity On Vertex Network)。

AOV网中不能有回路,不然就不能确定哪一个活动先举行了。因此,AOV网必须是一个有向无环图。


拓扑排序的代码原理&作用:

拓扑排序的实现是借助于对列用bfs实现的,同时对于每个顶点都会记录此时有多少指向他的边,即记录该顶点的入度 inN

此时提供一波小连招:

1、先把入度为0的顶点扔进对列

2、拿出队首元素,删除连带的边--->让被指的顶点的入度减1,就是代表这边对于这一个被指的顶点删除了。

3、此时会产生新的入度为0的顶点,把他们扔进对列

4、重复2、3,直至图中没有顶点或没有入度为0的顶点了


拓扑排序可以判断图中有没有环:

跑一遍拓扑排序算法,如果有顶点没有进队列,那么就代表有环。(环的入度不可能为0,进不来队列)


OJ题来源:洛谷

OJ题名:【模板】拓扑排序/家谱树

OJ题归属:图论基础【拓扑排序】

解题算法:拓扑排序

cpp 复制代码
#include<iostream>
#include<vector>
#include<queue>

using namespace std;

const int N = 110;

int n;
vector<int> a[N]; // 存图 -- 孩子表示法
int in[N]; // 存入度

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int x;
		while (cin >> x, x)
		{
			a[i].push_back(x);
			// 是 i 的孩子,肯定会被他的边指,入度加一
			in[x]++;
		}
	}

	queue<int> q;
	// 找出入度为0的入队
	for (int i = 1; i <= n; i++)
	{
		if (in[i] == 0) q.push(i);
	}

	while (q.size())
	{
		int p = q.front(); q.pop();
		cout << p << " ";

		// 遍历p的孩子
		for (auto& e : a[p])
		{
			// 删边
			in[e]--;
			// 把此时入度为0的顶点入队
			if (in[e] == 0) q.push(e);
		}
	}

	return 0;
}
相关推荐
一隅论数智18 小时前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
倒头就睡的小比特18 小时前
算法竞赛C++常用的STL
c++·算法
weilx123418 小时前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!18 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读19 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼19 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛20 小时前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车20 小时前
C/C++ 为什么需要编译器?
开发语言·c++
深圳老胡20 小时前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光20 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控