首页 > 其他分享 >拓扑排序

拓扑排序

时间:2022-08-19 10:56:57浏览次数:56  
标签:一个点 idx int 拓扑 入度 环图 排序

拓扑排序

拓扑序列是关于有向图的

拓扑序列:

对于图中的每条边(x, y),x在序列A中都出现在y之前,则称A是该图的一个拓扑序列

也就是说,把图中每一个点按拓扑序排好后,每一个点都是从前指向后的

如果一个图中有环,那么一定没法展成拓扑序

所以我们也称有向无环图为拓扑图

有向图中每一个点有入度和出度

入度:有多少边指向自己

出度:有多少边从这个点出去

因为拓扑序列都是从前指向后的,所以当前所有入度为0的点,都可以排在当前最前面的位置

性质:一个有向无环图,一定至少存在一个入度为0的点

证明:反证法

假设一个一个有向无环图,每一个点的入度都不是0

当往前找到n+1个点是必然存在两个点相同,就构成一个环

所以一个有向无环图,至少存在一个入度为0的点

#include <iostream>
#include <cstring>

using namespace std;

const int N = 100010;

int n, m;
int h[N], e[N], ne[N], idx;
int q[N], d[N];

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]) q[ ++ tt] = j; // 如果入度为0,加入队列
		}
	}
	
	return tt == n - 1; // 返回是否存在拓扑序
}

int main()
{
	scanf("%d%d", &n, &m);
	
	memset(h, -1, sizeof h);
	
	for (int i = 0; i < m; i ++ )
	{
		int a, b;
		scanf("%d%d", &a, &b);
		add(a, b);
		d[b] ++ ; // 更新入度
	}
	
	if (topsort()) // 队列里的次序恰好就是拓扑序
	{
		for (int i = 0; i < n; i ++ ) scanf("%d ", q[i]);
		printf("\n");
	}
	else
	{
		printf("-1\n");
	}
	
	return 0;
}

标签:一个点,idx,int,拓扑,入度,环图,排序
From: https://www.cnblogs.com/zyrddd/p/16601257.html

相关文章

  • 快速排序
    1.快速排序——分治#算法原理:在给定序列找到一个点x使得x左边区间数都小于x,右边区间数都大于x#步骤:确定分界点随机,可以是第一个数调整区间使左边都小于分......
  • c语言中使用冒泡排序法对数组进行排序
     001、#include<stdio.h>#defineNUMBER5voidpsort(intx[],intn){inti,j;for(i=0;i<n-1;i++)......
  • 归并排序
    归并排序整体上是递归,左边排好序+右边排好序+merge让整体有序让其整体有序的过程里用来排外序方法利用master公式来求解时间复杂度当然可以用非递归实现例:......
  • go 接口 实现sort排序接口 进行自定义排序
    packagemainimport("fmt""math/rand""sort")//学生结构体typeStudentstruct{NamestringIdstringAgeint}typeStudentA......
  • 05 - Volatile伪共享问题与Volatile重排序问题
    为什么Volatile不能保证原子性publicclassVolatileAtomThreadextendsThread{privatestaticvolatileintcount;publicstaticvoidmain(String[]arg......
  • 拓扑排序
    拓扑排序2022.8.16背景今天是LAF的生日,在被他的生日赛虐的时候,发现拓扑排序忘得差不多了,赶紧总结一下……问题设你有n个任务需要完成,一次只能完成一个任务,完成这些任......
  • 字符串大小写规则排序
    输入BadbAbB,输出AaBBbbd。因为A的ascii码比a小,所以相等的时候,直接输出a<b。不相等的时候,如果一个是大写,一个是小写,就要转换之后再比较。 #include<iostream>#include......
  • 亮点4-搜索结果的重新排序采用了本地单页排序和服务端多页排序两种可选模式-《教育行
    《教育行业核心数据流程管理平台》的设计当中,《学生基本信息》管理模块是一个最基本的模块,也是一个十分重要的平台组成部分。它的设计好坏,直接关系到业务管理人员的工作效......
  • Python快速排序
    defquicksort(array):less=[]greater=[]iflen(array)<=1:returnarraypivot=array.pop()forxinarray:ifx<=p......
  • 7-12 排序
    给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:数据1:只有1个元素;数据2:11个......