拓扑排序 topsort详解

1.定义

对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

 举例:

h3 { margin-top: 0.46cm; margin-bottom: 0.46cm; direction: ltr; color: #000000; line-height: 172%; text-align: justify; page-break-inside: avoid; orphans: 0; widows: 0 }
h3.western { font-family: "Calibri", "Lucida Sans Unicode", sans-serif; font-size: 16pt }
h3.cjk { font-family: "宋体"; font-size: 16pt }
h3.ctl { font-family: "Times New Roman", serif; font-size: 12pt; font-weight: normal }
p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; text-align: justify; orphans: 0; widows: 0 }
p.western { font-family: "Calibri", "Lucida Sans Unicode", sans-serif; font-size: 10pt }
p.cjk { font-family: "宋体"; font-size: 10pt }
p.ctl { font-family: "Times New Roman", serif; font-size: 12pt }
a:link { }

我们起床穿裤子和鞋子时,相信大部分人的顺序是这样的,先穿上内裤,然后再穿上裤子,再穿上袜子,然后才是鞋子。那么,我们把这些步骤分解:

(1)穿内裤

(2)穿裤子

(3)穿袜子

(4)穿鞋子

我们把这四个步骤,按照上述的顺序给排一下,就是所谓的拓扑排序 。

2.注意

1)只有有向无环图才存在拓扑序列;

2)对于一个DAG,可能存在多个拓扑序列;

如:

该DAG的拓扑序列为A B C D或者A C B D

而此有向图是不存在拓扑序列的,因为图中存在环路

3..拓扑序列算法思想

(1)从有向图中选取一个没有前驱(即入度为0)的顶点,并输出之;

(2)从有向图中删去此顶点以及所有以它为尾的弧;

重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

4.代码

#include<cstdio>
#include<cstring>
int ans[510][510];//记录两人是否进行了比赛
int n,indegree[510];//记录前驱个数
int queue[510];//保存拓扑
void topsort()
{
    int i,j,top,k=0;
    for(j=0; j<n; ++j)
    {
        for(i=1; i<=n; ++i)
        {
            if(indegree[i]==0)//前驱为零即是当前第一名
            {
                top=i;
                break;
            }
        }
        queue[k++]=top;//当前第一名入队列,也可以直接输出
        indegree[top]=-1;//前驱数量更新为-1,避免重复入队列
        for(i=1; i<=n; ++i)
        {
            if(ans[top][i])//将前驱中含有当前第一名的前去数量减一
                indegree[i]--;
        }
    }
    for(i=0; i<k-1; ++i)
        printf("%d ",queue[i]);
    printf("%d\n",queue[n-1]);
}

int main()
{
    int i,a,b,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(indegree,0,sizeof(indegree));//数组初始化为0
        memset(ans,0,sizeof(ans));//数组初始化为0
        for(i=0; i<m; ++i)
        {
            scanf("%d%d",&a,&b);
            if(ans[a][b]==0)
            {
                ans[a][b]=1;//记录是否进行了比赛
                indegree[b]++;//记录前驱数量
            }
        }
        topsort();
    }
    return 0;
}
时间: 2024-12-31 06:28:12

拓扑排序 topsort详解的相关文章

基本排序之详解归并排序

归并排序 一.归并排序的效率是仅次于快速排序的稳定的排序算法,其时间复杂度为O(nlog2n).我们对n 个元素进行一次归并排序时,归并的次数约为log2n,每一次的两路归并排序元素的比较次数约为n-1. 二.归并排序的基本思想: 归并排序是通过将一列数组序列中的元素看成一个一个的小序列来进行归并,直到所有的元素都被归并完成后,排序即完成,便是成功的完成了排序操作. 三.原理: 如:我们对n 为9吧,这样更加好,如,a[9] = {1,2,5,4,3,8,6,7,9}这样的一个数组: 原数组:

设计模式 - 模板方法模式(template method pattern) 排序(sort) 详解

模板方法模式(template method pattern) 排序(sort) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个主要的应用是排序(sort)算法. 对象的排列方式并不是完全相同, 所以需要排序(sort)算法compareTo()

13种排序算法详解

0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综合发散而来.比如说作为最基本的排序算法就种类很多,而事实上笔试面试过程中发现掌握的程度很一般,有很多题目,包括很多算法难题,其母题或者基本思想就是基于这些经典算法的,

js十大排序算法详解

十大经典算法导图  图片名词解释:n: 数据规模k:"桶"的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存 1.冒泡排序 1.1  原始人冒泡排序 function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分

【拓扑排序topsort】【p1226】神经网络

描述 Description 神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子: 神经元[编号为1) 图中,X1-X3是信息输入渠道,Y1-Y2是信息输出渠道,C1表示神经元目前的状态,Ui是阈值,可视为神经元的一个内在参数. 神经元按一定的顺序排列,构成整个神经网络.在兰兰的模型之中,神经网络中的神经元分为几层:称为输入层.输出层,和若干个中间层.每层神经元只向下一层的神经元输出信息,只从上一层神经元接受信息.下图是一个简单的三层神经网络

8-4.桶排序算法详解

1. 桶排序介绍 桶排序(Bucket sort)是一种基于计数的排序算法,工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序).当要被排序的数据内的数值是均匀分配的时候,桶排序时间复杂度为Θ(n).桶排序不同于快速排序,并不是比较排序,不受到时间复杂度 O(nlogn) 下限的影响. 桶排序按下面4步进行: 1. 设置固定数量的空桶. 2. 把数据放到对应的桶中. 3. 对每个不为空的桶中数据进行排序. 4. 拼接从不为空

JavaScript中数组Array.sort()排序方法详解

JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编码顺序)对数组中的元素进行排序,如果想按照其他标准进行排序,就需要进行传一个参数且为函数,该函数要比较两个值,并且会返回一个用于说明这两个值的相对顺序的数字. 1.对数字数组进行由小到大的顺序进行排序. 代码: var arr = [22,12,3,43,56,47,4]; arr.sort();

排序算法详解(Go语言实现):冒泡排序/选择排序/快速排序/插入排序

算法是程序的灵魂,而排序算法则是一种最基本的算法.排序算法有许多种,本文介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例. 一.冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数.经过第一次遍历之后,最大的数就在最右侧了:第二次遍历之后,第二大的数就在右数第二个位置了:以此类推. //冒泡排序(排序10000个随机整数,用时约145ms) func bubbleSort(nums []int) { for i