C语言 拓补排序 有向无环图

本文介绍了拓补排序的概念,重点讲述了如何在C语言中实现这一算法,通过深度优先搜索策略,根据顶点的入度进行排序。文章包括了算法的实现过程和具体代码示例。
摘要由CSDN通过智能技术生成

拓补排序简介

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前

首先需要知道一个概念:入度。

通常指有向图中某点作为图中边的终点的次数之和。

比如:
这里写图片描述

节点 A B C D E
入度 0 1 1 1 3
实现过程

对图进行深度优化搜索,将顶点放入数组中,改变与之连接的下个节点的入度。

图片取自:拓扑排序(Topological Sorting)
这里写图片描述

代码实现

核心代码:

BOOLEAN isInTop(VTYPE *topNum, int length, VTYPE key) {
    for (int i = 0; i < length; i++) {
        if (topNum[i] == key) {
            return TRUE;
        }
    }
    return FALSE;
}

int degreePos(AdjGraphPtr adj, VTYPE *topNum , int length) {
    int pos = -1;
    for (int i = 0; i < adj->vNum; i++) {
        if (adj->vertexList[i]->degree == 0) {
            if (isInTop(topNum, length, adj->vertexList[i]->v) == FALSE) {
                pos = i;
                return pos;
            }
        }
    }
    return pos;
}

int getEmptyPos(VTYPE *topNum, int length) {
    //获得未使用的位置
    for (int i = 0; i < 5; i++) {
        if (topNum[i] == 0) {
            return i;
        }
    }
    return -1;
}

int dfs(AdjGraphPtr adj, VTYPE *topNum, int length, int pos) {
    EdgePtr tmp = adj->vertexList[pos]->firstEdge;
    while (tmp != NULL) {
        VTYPE w = tmp->w;
        int w_pos = getVertexPos(adj, w);
        adj->vertexList[w_pos]->degree--;
        if (adj->vertexList[w_pos]->degree == 0)
            continue;

        if (isInTop(topNum, length, w) == FALSE) {
            int emptyPos = getEmptyPos(topNum, length);
            
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值