当前位置: 首页 > news >正文

拓扑排序的核心算法:BFS应用与实践

目录

一、拓扑排序简介

二、BFS解决拓扑排序的步骤

三、C++实现

四、代码解释

五、总结


一、拓扑排序简介

        拓扑排序是对有向无环图(DAG)进行排序的一种方法,使得对于图中的每一条有向边 (u, v),u 在排序中总是位于 v 的前面。拓扑排序的结果可能不唯一。

二、BFS解决拓扑排序的步骤

  1. 初始化:计算每个顶点的入度(即指向该顶点的边的数量),并将所有入度为0的顶点加入队列。

  2. BFS遍历

    • 从队列中取出一个顶点,将其添加到拓扑排序的结果中。

    • 移除该顶点的所有出边,即将其邻接顶点的入度减1。

    • 如果某个邻接顶点的入度变为0,则将其加入队列。

  3. 结束条件:当队列为空时,如果拓扑排序结果中的顶点数量与图中的顶点数量相同,则排序成功;否则,图中存在环,无法进行拓扑排序。

三、C++实现

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

vector<int> topologicalSort(int V, vector<vector<int>>& adj) {
    vector<int> inDegree(V, 0);
    for (int u = 0; u < V; ++u) {
        for (int v : adj[u]) {
            inDegree[v]++;
        }
    }

    queue<int> q;
    for (int u = 0; u < V; ++u) {
        if (inDegree[u] == 0) {
            q.push(u);
        }
    }

    vector<int> result;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        result.push_back(u);

        for (int v : adj[u]) {
            if (--inDegree[v] == 0) {
                q.push(v);
            }
        }
    }

    if (result.size() != V) {
        cout << "图中存在环,无法进行拓扑排序" << endl;
        return {};
    }

    return result;
}

int main() {
    int V = 6;
    vector<vector<int>> adj = {
        {2, 3},
        {3, 4},
        {5},
        {5},
        {5},
        {}
    };

    vector<int> sortedOrder = topologicalSort(V, adj);
    for (int u : sortedOrder) {
        cout << u << " ";
    }
    cout << endl;

    return 0;
}

四、代码解释

  • inDegree 数组用于存储每个顶点的入度。

  • adj 是图的邻接表表示。

  • topologicalSort 函数实现了拓扑排序的逻辑。

  • 如果排序结果中的顶点数量与图中的顶点数量不一致,说明图中存在环。

五、总结

        使用BFS进行拓扑排序是一种高效的方法,时间复杂度为O(V + E),其中V是顶点数量,E是边数量。这种方法不仅适用于拓扑排序,还可以用于检测图中是否存在环。

相关文章:

  • 哈希表_有效的字母异位词
  • 利用python进行数据分析(重点、易忘点)---第九章绘图和可视化
  • Fisher信息矩阵与Hessian矩阵:区别与联系全解析
  • [250224] Yaak 2.0:Git集成、WebSocket支持、OAuth认证等 | Zstandard v1.5.7 发布
  • Openwrt路由器操作系统
  • 蓝桥杯备赛-迷宫-BFS
  • Logic-RL:Unleashing LLM Reasoning with Rule-Based Reinforcement learning
  • 3.1.2移位运算--算术移位
  • 开发 picgo-plugin-huawei 插件,解决华为云社区外链限制问题
  • Visual Studio 安装全攻略
  • 大厂数据仓库数仓建模面试题及参考答案
  • ubuntu windows双系统踩坑
  • 算法题(77):数组中的第k个最大元素
  • [C语言日寄]以指针进阶:空类型指针与qsort函数
  • 【javaEE】计算机是如何工作的(基础常识)
  • 豆包、扣子等产品如何与CSDN合作?
  • 初识.git文件泄露
  • 如何在自己的电脑上部署Deepseek,Deepseek本地部署
  • WebRTC解析
  • 堆排序(详解)c++
  • 换灯如换脸!西安碑林整修重开观展体验提升
  • 围绕加快科创中心建设,上海市委中心组学习会听取专题辅导报告
  • 北师大发布《短视频家长指南》,回应短视频时代家庭教育挑战
  • A股高开高走:宠物经济走强,超3800股收涨,两市成交超1.1万亿元
  • 4天内,云南昆明又一县市区原主官被查
  • 上海迪士尼蜘蛛侠主题园区正式动工,毗邻“疯狂动物城”