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

拓补排序

时间:2023-09-21 19:12:01浏览次数:32  
标签:终点 入度 vector 序列 排序 那么 拓补

拓补排序是对有向图的一种处理方式,目的是得到拓补序列,一个有向图,他肯定有很多节点和有向边,拓补序列的性质就是图中所有的边所对应的两个点在该序列中都是起点在前终点在后
如下图,其中的一种拓补序列就是1 2 4 3 5,图中的所有有向边是{1,2},{1,4},{2,3},{2,5},{4,5}。1在2的前面,1在4的前面.......

那我们如何得到这个序列呢?其中图有一个概念在离散数学中提到过了————出度和入度,如果这个点作为有向边的起点,那么出度+1,如果作为终点,那么入度+1。首先,如果一个点入度为0,那么很明显它可以直接拿出来了,因为他不会作为有向边的终点了,那么以他为起点的边也可以删除,如下图(1这个点入度为0,可以直接拿出来,那么他与2 4相连的边也就可以直接删除了)

此时很好发现,2和4的入度也都-1了,且2和4入度都变为0了,那么我们也可以直接拿出来,此时得到的拓补序列就是1 2 4了。

此时就剩下3 5两个点并且边都已经被删除了,那么我们也可以直接拿出来了。所以我们得到了最后的拓补序列1 2 4 3 5。
以下就是代码实现了

点击查看代码
vector<int> L;//L用来存储最终的拓补序列
vector<int> g[10000];//vector用来存边g[i][j]就是以i为起点j为终点存在一条边
void tuobu()
{
    deque<int> q;//q用来存储已知入度为0的点
    for (int i = 1; i <= n; i++)//找到一开始入度就为0的点,比如上图的1点
    {
        if (depth[i] == 0) // 如果这个点入度为0
        {
            q.push_back(i);
            L.push_back(i);
        }
    }
    while (!q.empty())
    {
        int pos = q.front();//取出入度为0的点
        q.pop_front();在序列中将他弹出(删除)
        for (auto i : g[pos])//遍历以这个点为起点的边
        {
            depth[i]--;//把所有边的终点入度-1(模拟删除边,好比上图我取出1,那么2和4与1相连的边就要删除
            //2和4的入度就要-1
            if (depth[i] == 0) // 如果这个点入度为0,如果此时2 4两点的入度变成了0,那么就可以推入L和q
            {
                q.push_back(i);
                L.push_back(i);
            }
        }
    }
}

标签:终点,入度,vector,序列,排序,那么,拓补
From: https://www.cnblogs.com/myy-zzb/p/17720713.html

相关文章

  • python,一个数组y1存放yolo的位置信息BBOX,一个y2数组存放识别的结果信息,根据y1数组按
    importnumpyasnp#示例数据y1=np.array([[50,100,200,300],[10,20,30,40],[60,70,80,90]])y2=np.array(['cat','dog','bird'])#按左上角点的坐标排序y1数组sorted_indices=np.lexsort((y1[:,1],y1[:,0]))y1_sorted=y1[sorted......
  • MySQL中row_number()的实现,查询记录排序行数
    MySQL中row_number()的实现,查询记录排序行数时间  2019-12-06标签 mysql row number 实现 查询 记录 排序 行数 栏目 MySQL 繁體版原文   https://my.oschina.net/u/3087202/blog/1842169  在MySQL8.0之前是有没row_number()这个窗口函数的,若是想实......
  • [剑指offer] 排序篇
    JZ3 数组中重复的数字⭐1/*2*①map/set3*②因为"长度为n的数组里的所有数字都在0到n-1的范围内"4*所以对数组进行调整使得numbers[idx]==idx5**/6publicclassJZ3_17{8publicstaticintduplicate(int[]numbers)9{10f......
  • 15-Vue核心-列表过滤和列表排序
    列表过滤 监视属性,实现列表过滤<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>基本列表</title><!--引入Vue--><scripttype="text/javascript......
  • 一键实现冒泡排序算法,代码质量有保障!
    近年来,深度学习和神经语言模型作为提高开发人员生产力的手段,尤其是2022年11月30日,ChatGPT这一现象级热点得出横空出世,在全球范围内形成了热烈的讨论,其中关于自动化代码生成和其它软件工程方面受到了极大的关注。 软件开发过程涵盖了各种代码生成任务,包括代码自动生成、代码翻......
  • 一键实现冒泡排序算法,代码质量有保障!
    近年来,深度学习和神经语言模型作为提高开发人员生产力的手段,尤其是2022年11月30日,ChatGPT这一现象级热点得出横空出世,在全球范围内形成了热烈的讨论,其中关于自动化代码生成和其它软件工程方面受到了极大的关注。软件开发过程涵盖了各种代码生成任务,包括代码自动生成、代码翻译和......
  • mybatis实现多字段动态排序
    背景在复杂项目中,可能会对数据表多个字段进行排序,不理解的话可结合需求看。需求现在有一张User表男同学先按age降序排序,后按height降序排序,最后按id升序排序女同学先按age升序排序,后按weight降序排序,最后按id升序排序不合理?现实可能就是这么的不合理。实现排序对(字段......
  • Sql Server分组排序及生成序列号
    1--1.分组排序2SELECT*,ROW_NUMBER()OVER(PARTITIONBY@fileName,@fileName1ORDERBYIDDESC)ASrowNumFROM@tableName34--2.生成序列号5SELECT*,ROW_NUMBER()over(orderbyidASC)ASrowNumFROM@tableName 翻译搜索复制......
  • 软件测试|Python如何将列表从大到小排序
    简介在编程中,对列表进行排序是一个常见的操作,有时候我们需要将列表按照从大到小的顺序进行排列。Python提供了多种方法来实现这一目标。在本文中,我们将深入探讨几种将列表从大到小排序的方法,帮助您根据不同情况选择最合适的方式。使用sorted()函数Python的sorted()函数可以接收一......
  • 表格的自定义排序 编辑 拖拽 缩放
    终于能闲下来做点自己想做的事情了.. 简单表格排序  可以双击编辑自定义编辑后的规则 可拖动列进行列替换 可推动边框进行列宽度的缩放  ie6下中文不自动换行 非ie下字母和数字也不自动换行确实让人恼火 chrome浏览器下点击运行好像问题很大 拿到本地测试会比较好<!......