首页 > 其他分享 >拓扑序

拓扑序

时间:2023-07-24 23:31:47浏览次数:32  
标签:idx int 拓扑 入度 ++ 节点

通俗解释拓扑序就是一个包含依赖关系的序列 假设做C之前必须做完B,做B之前必须做完A,拓扑序就是ABC

实现思路

维护各个节点的入度,将入度为0的节点入队 将入度为0的节点的所有周边节点的入度减1,并将入度为0的节点入队 当队列为空时,过程结束。 若图中存在环路,则进入队列的元素个数<总节点个数,由此可判断图中是否存在环

易错点

拓扑序只能验证图中是否存在环,而无法对图的连通性做出验证

代码实现

#include <iostream>
#include <cstring>

using namespace std;

const int N = 1e5 + 10;

int n, m;
int head[N], e[N], ne[N], idx;
int in[N], q[N];

void insert(int a, int b)
{
    e[idx] = b;
    ne[idx] = head[a];
    head[a] = idx ++;
}
bool topsort()
{
    int hh = 0, tt = -1;
    
    for (int i = 1; i < n; ++ i)
        if (!in[i]) q[++ tt] = i;
    
    while (hh <= tt)
    {
        int t = q[hh ++];
        for (int i = head[t]; i != -1; i = ne[i])
        {
            int c = e[i];
            -- in[c];
            if (!in[c]) q[++ tt] = c;
        }
    }
    
    return tt == n - 1; // 如果存在拓扑序列也就是不存在环路,那么所有点一定都可以被访问到,由于tt从0开始,n个点tt最大为n-1
}
int main()
{
    memset(head, -1, sizeof head); // 初始化链表头需要在更新链表之前进行
    cin >> n >> m;
    for (int i = 0; i < m; ++ i) 
    {
        int a, b;
        cin >> a >> b;
        insert(a, b);
        ++ in[b];
    }
    
    if (!topsort()) cout << -1 << endl;
    else 
    {
        // 非常巧妙的是如果存在拓扑序列,那么它正好就是队列中的顺序
        for (int i = 0; i < n; ++ i) cout << q[i] << ' ';
        cout << endl;
    }
    return 0;
}

标签:idx,int,拓扑,入度,++,节点
From: https://blog.51cto.com/u_14882565/6841316

相关文章

  • 一棵有根树的拓扑排序数量
    今日见到一个有趣的问题,就是本篇的题目。这里可以把它看作一个dp问题,\(f_i\)表示以\(i\)为根节点的子树的拓扑排序数量,要求出\(f_i\),就要知道\(f_j\)(\(j\inSon_i\)),但是它不是处理完一个子树,再处理另一个子树,它是穿插着来的,所以这个问题就变成了,已知\(k\)个序列,问有多少序列满足......
  • 拓扑排序
    定义:对一个有向图构造拓扑序列,排序类似流程图那样按先干什么后干什么这样排序拿大学教学安排举个例子(图来自oiwiki)先不要考虑操作系统到数据结构那条蓝线。那么我们要先学程序设计才能学习后面的算法语言,离散数学等等。那么在拓扑序列中,程序设计就要在算法语言,离散数学......
  • 数据结构与算法 头歌 图的拓扑排序算法
    数据结构与算法之图的拓扑排序算法导言拓扑排序是对有向无环图(DirectedAcyclicGraph,DAG)进行排序的一种算法。在实际开发中,拓扑排序算法常用于解决任务调度、编译顺序等问题。本文将介绍拓扑排序算法的实现过程,并帮助初学者理解该算法的原理及代码实现。拓扑排序流程以下......
  • 拓扑排序算法相关的知识点总结
    拓扑排序算法相关的知识点总结拓扑排序算法是一种对有向无环图(DAG)进行排序的方法,它可以将图中的所有顶点排成一个线性序列,使得对于任意一对顶点u和v,如果存在一条从u到v的有向边,那么u在序列中必然出现在v之前。拓扑排序算法可以用来解决一些依赖关系的问题,例如课程安排、工程进度......
  • 图的应用--拓扑排序
    图的应用--拓扑排序有向无环图的应用AOV网:AOE网:什么是拓扑排序排课表上面的就是一个AOV网AOV网的特点若从i到j有一条路径,则i是j的前驱;j是i的后继.若<i,j>是网中有向边,则i是j的直接前驱;j是i的直接后继.在AOV网中不允许有回路,因为如果有回路存在,这表明某......
  • 锂电池主动均衡simulink仿真 四节电池 基于buckboost(升降压)拓扑 (还有传统电感均衡+
    锂电池主动均衡simulink仿真四节电池基于buckboost(升降压)拓扑(还有传统电感均衡+开关电容均衡+双向反激均衡+双层准谐振均衡+环形均衡器+cuk+耦合电感)被动均衡电阻式均衡、分层架构式均衡以及分层式电路均衡,多层次电路,充放电。YID:28100645079329722......
  • 新型DCDC拓扑,电压增益大,包含储能光伏控制
    新型DCDC拓扑,电压增益大,包含储能光伏控制ID:29600638012912933......
  • 蚁群算法即使在迭代过程中也能动态适应拓扑偏移。它是如何实现这一目标的?
    蚁群算法通过模拟蚂蚁在寻找食物的过程中的行为,来解决优化问题。在迭代过程中,它能够动态适应拓扑偏移,主要通过以下几个步骤来实现:蚂蚁的移动:蚂蚁根据之前的经验和信息素浓度,选择下一个移动的位置。这个选择过程受到了拓扑偏移的影响,因为蚂蚁会更倾向于选择与当前位置更接近目标......
  • 39. 拓扑排序
    一、什么是拓扑排序  拓扑排序是对有向无圈图的顶点的一种排序,它使得如果存在一条从\(v_{i}\)到\(v_{j}\)的路径,那么排序中\(v_{j}\)出现在\(v_{j}\)的后面。有向边(v,w)表明任务v必须在任务w前完成。显然,如果图含有圈,那么拓扑排序是不可能的,因为对于圈上的两个......
  • 网络基本认知(2)--网络拓扑图的规划与设计
    专业和班级信息与计算科学数理综合班成绩 姓名lhk学号1225课程名称计算机网络实验名称网络基本认知(2)--网络拓扑图的规划与设计实验目的和要求理解网络工程的有关概念;描述特定网络工程的需求,并对其进行分析;根据用户需求......