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

拓扑排序的核心算法: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是边数量。这种方法不仅适用于拓扑排序,还可以用于检测图中是否存在环。


http://www.kler.cn/a/560437.html

相关文章:

  • 国内主流 AI 能力特点对比
  • 2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码
  • clickhouse--表引擎的使用
  • 使用S32DS部署Tensorflow lite到S32K3
  • 开源基准测试模拟器:BlueROV2 水下机器人的控制
  • python绘图之swarmplot分布散点图
  • 法线向量在3D机器视觉中的应用
  • 开源神器KRR:用数据驱动K8s资源优化
  • 目标检测数据集-风机叶片缺损检测数据集(适用YOLO全系列)
  • 鸿蒙NEXT开发-位置服务
  • Node.js 中 child_process 模块教程
  • DeepSeek AI人工智能该如何学习?
  • 【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,
  • [Android]DialogLifeCycle禁止点击背景关闭弹窗
  • 芯谷 D1517AT:多媒体音响系统的音频功率放大利器
  • uniapp h5端和app端 使用 turn.js
  • AI赋能游戏前端:效率革命与沉浸式体验的未来
  • 科技改变生活:未来趋势与应用解析
  • python类型转换深浅拷贝
  • w227springboot旅游管理系统设计与实现