美文网首页
数据结构与算法-拓扑排序

数据结构与算法-拓扑排序

作者: 收纳箱 | 来源:发表于2020-05-13 10:31 被阅读0次

1. 思路

  1. 每次需要判断一个顶点的入度,入度为零,说明这个顶点之前没有其他前置顶点了。
    • 入度为零,则用一个数据结构来存储。
      • C语言可以用栈、队列。
      • Swift可以考虑直接用数组。
  2. 从入度为零的顶点中取一个出来, 断开它指向的其它顶点。(这里入度是关键,只需要入度减少就行)
  3. 如果被指向的顶点入度减一之后为零,则把该顶点加入到栈、队列或数组中(以后的备选顶点)。
  4. 备选顶点空了之后,判断最大备选顶点数和总顶点数是否相等。
    • 全部顶点都被输出了,才是拓扑排序,否则存在环。

2. 基础数据结构

这里使用邻接表实现。

  • 需要记录、更新入度。
  • 遍历边表更快(不涉及不相连的顶点)。
#define MAXVEX 14

//边表结点
typedef struct EdgeNode {
    //邻接点域,存储该顶点对应的下标
    int adjvex;
    //用于存储权值,对于非网图可以不需要
    int weight;
    //链域,指向下一个邻接点
    struct EdgeNode *next;
} EdgeNode;

//顶点表结点
typedef struct VertexNode {
    //顶点入度
    int in;
    //顶点域,存储顶点信息
    int data;
    //边表头指针
    EdgeNode *firstedge;
} VertexNode, AdjList[MAXVEX];

2. 实现

Status TopologicalSort(GraphAdjList GL){
    // 创建一个栈
    int top = -1;
    int *stack = (int *)malloc(sizeof(int) * GL->numVertices);
    
    // 先把所有入度为0的顶点入栈
    for(int i = 0; i < GL->numVertices; i++)
        if(GL->adjList[i].in == 0)
            stack[++top] = i;
    
    EdgeNode *edge; // 辅助遍历边
    int idx; // 顶点的索引
    int count = 0; // 统计遍历顶点的个数,所有顶点都被访问过,拓扑排序才正确
    while (top > -1) {
        idx = stack[top--]; // 拿到栈顶顶点索引,同时出栈
        count++; // 计数+1
        printf(" -> %d", GL->adjList[idx].data); // 输出一下
        
        edge = GL->adjList[idx].firstedge; // 获取边表头结点
        while (edge) {
            idx = edge->adjvex; // 获取顶点索引
            if (--GL->adjList[idx].in == 0) { // 入度-1,同时如果结果==0,则入栈
                stack[++top] = idx;
            }
            edge = edge->next; // 继续遍历
        }
    }
    printf("\n");
    // 所有顶点都被访问过,拓扑排序才正确
    if (count != GL->numVertices) {
        return ERROR;
    }
    return OK;
}

相关文章

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • (转)排序算法

    排序算法点这里 数据结构与算法——计数排序、桶排序、基数排序

  • 算法与数据结构(六):堆排序

    title: 算法与数据结构(六):堆排序tags: [算法与数据结构, C语言, 堆排序]date: 2019-...

  • 数据结构与算法-拓扑排序

    拓扑排序介绍 我们会把施工过程、生产流程、软件开发、教学安排等都当成一个项目工程来对待,所有的工程都可分为若干个“...

  • 数据结构与算法-拓扑排序

    1. 思路 每次需要判断一个顶点的入度,入度为零,说明这个顶点之前没有其他前置顶点了。入度为零,则用一个数据结构来...

  • 数据结构与算法-拓扑排序

    一、定义 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我...

  • 7.6图的应用:拓扑排序

    拓扑排序Topological Sort ❖从工作流程图得到工作次序排列的算法,称为“拓扑排序”❖拓扑排序处理一个...

  • 模板

    并查集 拓扑排序 Floyd算法 Dijkstra算法

  • LeetCode 第207题:课程表

    1、前言 2、思路 使用拓扑排序的方法,拓扑排序其实是使用的 BFS 算法,简而言之使用 BFS 算法解题。算法流...

  • Hash算法

    数据结构与算法分析:大纲数据结构:数组算法:hash算法算法:排序算法Java实现 1 Hash算法? 将任意长度...

网友评论

      本文标题:数据结构与算法-拓扑排序

      本文链接:https://www.haomeiwen.com/subject/kungnhtx.html