搜索与图论——拓扑排序

有向图的拓扑排序就是图的宽度优先遍历的一个应用

有向无环图一定存在拓扑序列(有向无环图又被称为拓扑图),有向有环图一定不存在拓扑序列。无向图没有拓扑序列。

拓扑序列:将一个图排成拓扑序后,所有的边都是从前指向后的。

入度:有多少条边指向自己

出度:有多少条边指向别人

入度为0的点都可以排在最前边

cpp 复制代码
#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];
int 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]; //枚举t的所有出边j
            d[j] -- ; /删掉t -> j边,j的入度--
            if(d[j] == 0) q[ ++ tt] = j; //如果j的入度==0,推入队列
        }
    }
    return tt == n - 1; //如果队尾 == n - 1说明所有点都进过队列了,说明该图是一个有向无环图
}

int main()
{
    cin >> n >> m;
    memset(h, -1, sizeof h);
    while(m -- )
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
        d[b] ++ ;
    }
    if(topsort())
    {
        for(int i = 0; i < n; i ++ ) cout << q[i] << " ";
    }
    else cout << -1 << endl;
    return 0;
}
相关推荐
航Hang*2 分钟前
第三章:综合布线技术 —— 工作区子系统的设计与施工
网络·笔记
alphaTao13 分钟前
LeetCode 每日一题 2025/12/29-2026/1/4
算法·leetcode
ShaderJoy13 分钟前
ShaderJoy —— 《对称镜面下的绞肉机》【算法悬疑短文】【Python】
算法·leetcode·面试
读创商闻16 分钟前
中广融投让传统文化 “活” 起来
大数据·网络·人工智能
智驱力人工智能17 分钟前
在安全与尊严之间 特殊人员离岗检测系统的技术实现与伦理实践 高风险人员脱岗预警 人员离岗实时合规检测 监狱囚犯脱岗行为AI分析方案
人工智能·深度学习·opencv·算法·目标检测·cnn·边缘计算
培林将军19 分钟前
C语言指针
c语言·开发语言·算法
Geometry Fu22 分钟前
《无线传感器网络》WSN 第6讲 IEEE802.15.4通信标准 知识点总结+习题讲解
网络
adam_life23 分钟前
P3375 【模板】KMP
算法
jllllyuz25 分钟前
基于差分进化算法优化神经网络的完整实现与解析
人工智能·神经网络·算法
yongui4783427 分钟前
基于卡尔曼滤波的电池荷电状态(SOC)估计的MATLAB实现
开发语言·算法·matlab