C/C++浅析邻接表拓扑排序算法的实现

C/C++浅析邻接表拓扑排序算法的实现

什么是拓扑排序

在图论中,若存在一种拓扑序列,使得对于任意的有向边(u,v),u在序列中都在v的前面,则称该图为拓扑排序,该序列称为拓扑序列。拓扑排序是一个有向无环图(DAG, Directed Acyclic Graph)的一种线性序列。

拓扑排序算法的实现

拓扑排序算法的实现一般基于邻接表,其核心思路为:先将所有入度为0的点入队,扫描队列中的点,把该点所指向的点的入度减1,若减为0,则将该点入队。最后,若可入队的点数小于图中点数,则该图不存在拓扑序列。

关键代码实现

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int MAXN = 10005;

struct Edge {
    int to, next;
} edges[MAXN];
int head[MAXN], degree[MAXN];
int cnt;

void addEdge(int u, int v) {
    edges[cnt].to = v;
    edges[cnt].next = head[u];
    head[u] = cnt++;
    degree[v]++;
}

bool topsort(int n) {
    queue<int> q;
    for (int i = 1; i <= n; i++) {
        if (!degree[i]) q.push(i);
    }

    int cnt = 0;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        cnt++;
        for (int i = head[u]; ~i; i = edges[i].next) {
            int v = edges[i].to;
            degree[v]--;
            if (!degree[v]) {
                q.push(v);
            }
        }
    }

    return cnt == n;
}

int main()
{
    int n, m;
    cin >> n >> m;
    memset(head, -1, sizeof(head));
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        addEdge(u, v);
    }

    if (!topsort(n)) {
        cout << "No topsort!" << endl;
        return 0;
    }
    for (int i = 1; i <= n; i++) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

示例说明

示例1

输入:

7 9
7 6
7 5
6 4
6 3
5 4
5 2
4 1
3 1
2 1

输出:

7 6 5 4 3 2 1 

示例2

输入:

6 6
1 2
1 3
2 4
2 5
3 6
4 6

输出:

No topsort!

性能分析

时间复杂度:O(V+E)。其中,V为图中点数,E为图中边数。因为算法需要遍历每一个点和边。

空间复杂度:O(V+E)。其中,V为点数,E为边数。因为需要存储每个点的边列表以及每个点的入度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++浅析邻接表拓扑排序算法的实现 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • C语言实现单链表的快速排序算法

    下面是详细的攻略: 单链表快速排序算法的原理 在单链表上实现快速排序,需要了解快速排序算法的原理。快速排序是一种常用的基于比较的排序算法,它的基本思想是:选取一个基准元素(pivot),将数组分成两个部分,一个部分是小于基准元素的,一个部分是大于基准元素的。然后对这两个部分分别递归进行快排,最终得到排序后的数组。 在单链表上,选择基准元素也是一样的,不同的是…

    算法与数据结构 2023年5月19日
    00
  • JS中数据结构与算法—排序算法(Sort Algorithm)实例详解

    以下是关于“JS中数据结构与算法—排序算法(Sort Algorithm)实例详解”的完整攻略。 简介 数学中有一种重要的问题是如何将一组数据按照一定的规则有序排列。排序算法(Sort Algorithm)就是解决这种问题的一种算法。 在JS中,包含了许多排序算法的实现,包括:冒泡排序、选择排序、插入排序、快速排序、归并排序等。了解和掌握这些算法,有助于…

    算法与数据结构 2023年5月19日
    00
  • C语言超详细讲解排序算法上篇

    C语言超详细讲解排序算法上篇 简介 本文将介绍排序算法的基础知识和常见排序算法,包括冒泡排序、选择排序、插入排序。 排序算法是计算机科学中非常重要的算法之一,在实际开发中也经常用到。了解各种排序算法的特点和优缺点,可以帮助我们更好地应对实际问题。 基础知识 在介绍排序算法之前,有一些基础知识需要了解。 1. 时间复杂度 时间复杂度用来衡量一个算法所需要的计算…

    算法与数据结构 2023年5月19日
    00
  • C++ 基本算法 冒泡法、交换法、选择法、实现代码集合

    C++ 基本算法 冒泡法、交换法、选择法 在编程中,基本算法是非常重要的。本文将介绍C++中基本算法的三种实现方式:冒泡排序、交换排序、选择排序,并附上相应的实现代码集合以及示例说明。 冒泡排序 冒泡排序,顾名思义,就像水中的气泡一样,从底部慢慢上升。在排序过程中,每次比较相邻两个元素的大小,如果发现顺序不对,就进行交换,直到所有元素都排列好。冒泡排序的时间…

    算法与数据结构 2023年5月19日
    00
  • C语言的冒泡排序和快速排序算法使用实例

    C语言的冒泡排序和快速排序算法使用实例 什么是排序算法 排序算法是一种将一组数据按照特定顺序排列的算法。常见的排序算法包括冒泡排序、快速排序、插入排序、选择排序等。 冒泡排序 冒泡排序是一种简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就交换它们的位置。重复这个过程,直到没有再需要交换的元素,即排序完成。 以下是 C 语…

    算法与数据结构 2023年5月19日
    00
  • c++数组排序的5种方法实例代码

    C++ 数组排序的 5 种方法实例代码 本篇文章介绍了使用 C++ 实现数组排序的 5 种方法,包括冒泡排序、选择排序、插入排序、希尔排序和快速排序。下面我们就分别详细阐述各种排序方法的实现。 冒泡排序 冒泡排序的基本思想是比较相邻的两个元素,如果顺序错误就交换位置。我们重复地执行这个过程,直到排序完成。示例代码如下: void BubbleSort(int…

    算法与数据结构 2023年5月19日
    00
  • 详解JavaScript如何实现四种常用排序

    详解JavaScript如何实现四种常用排序 排序是计算机科学中的重要概念,其主要目的是将一组元素按照一定规则进行排序,便于使用。常见的排序算法有四种:冒泡排序、插入排序、选择排序和快速排序。本文将详细讲解如何使用JavaScript实现这四种常用排序。 冒泡排序 冒泡排序是最简单的排序算法之一,其基本思想是将要排序的数据按从小到大的顺序排列。具体实现过程如…

    算法与数据结构 2023年5月19日
    00
  • Trie树_字典树(字符串排序)简介及实现

    接下来我将详细讲解“Trie树_字典树(字符串排序)简介及实现”的完整攻略。 什么是 Trie 树? Trie 树,也叫字典树,是一种树形数据结构,用于处理字符串匹配、排序等问题。它的特点是能够快速地查找特定前缀或后缀的字符串。 Trie 树的基本实现 Trie 树通常是一棵多叉树,其中根节点不包含任何字符,每个子节点包含一个字符,组成一个完整的字符串。下面…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部