拓扑排序详解

本文详细介绍了拓扑排序的概念,它不是常规意义上的排序,而是针对有向无环图的一种线性次序。拓扑排序要求如果图G中存在边(u, v),则u必须在排序结果中位于v之前。通过深度优先搜索(DFS)和队列可以实现拓扑排序,时间复杂度为O(V+E)。文章还给出了简单的实现代码。" 111485964,10293220,Python文本分类实践:从数据预处理到深度学习模型,"['Python文本分类框架', '机器学习', '自然语言处理', '深度学习']
摘要由CSDN通过智能技术生成

        拓扑排序这种新手算法,在一年前我就已经系统地学过,但由于各种各样的原因,我不是很理解。在最近的比赛中,又遇到了一道拓扑排序题,尽管我运用堆勉强解决,但还是很不甘心,所以今天来复习一下拓扑排序。

        先来说说拓扑排序是什么。虽然名字叫排序,但拓扑排序却不是我们平常说的排序。对于一个有向无环图G=(V,E)来说,其拓扑排序是其所有结点的一种线性次序,该次序满足如下条件:如果图G包含边(u,v),则节点u在拓扑排序中处于节点v的前面(如果图中包含环路,则不可能拍出一个线性次序)。因此,我们可以将图的拓扑排序看作是图的所有节点在一条水平线上排开,所有有向边都从左指向右。

        明白了拓扑排序的定义,实现就很容易了。对于一个有向无环图G=(V,E),我们所需的时间复杂度就是O(V+E),V是点数,E是边数。我们可以从任意一个节点开始,dfs一次,然后,维护一个队列,当当前搜索到的点没有其他未经过的点相邻时,我们就可以将它放入队尾,最后输出队列就行了。

        代码如下:

#include<iostream>
#include<cstdio>

using namespace std;

int n,m,u,v,tot,k;
int f[200001][3],q[100001],ans[100001];
bool bz[200001];
	
void dfs(int x)
{
	printf("%d\n",x);
	for (int i=q[x];i;i=
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值