基于邻接表的拓扑排序 A0V网

c 复制代码
typedef struct ArcNode {
    int adjvex;  // 该边所指向的顶点的序号
    struct ArcNode *nextarc;  // 指向下一条边的指针
    int weight; // 边的权值
} ArcNode;  // 弧边的节点结构

typedef struct {
    int data;  // 顶点信息
    int inDegree;  // 顶点的入度
    ArcNode *firstarc; // 指向第一条依附该点的边的指针
} AdjList[5]; // 定点的节点结构

typedef struct {
    AdjList adjList;  //
    int vexnum, arcnum;  // 图当前的顶点数和边数
} Graph;//图的结构定义


/**
 * 拓扑排序 A0V网
 * AOV(有向图):用顶点表示活动,用弧边表示优先关系;图中没有环
 * 算法步骤:
 *  1.栈初始化,累加器count初始化
 *  2.扫描顶点表,将没有入度的顶点加入栈中
 *  3.当栈非空时,循环
 *      3.1.退出栈顶元素,累加器+1
 *      3.2.将退出的栈顶元素的各个邻接点的入度-1
 *      3.3.将退出后的度为0的顶点,加入栈中
 * 可以用于判断图中有没有环
 * 即 count ?= g->vexnum
 * @param g
 */
void TopoSort(Graph *g){
    // 栈初始化,累加器count初始化
    int count = 0;
    Stack *stack = NULL;
    stack = initStack(stack);
    //扫描顶点表,将没有入度的顶点加入栈中
    for (int i = 0; i < g->vexnum; ++i) {
        if(g->adjList[i].inDegree == 0){
            enStack(stack, g->adjList[i].data);
        }
    }
    ArcNode *arc = NULL;
    printf("拓扑排序:");
    //当栈非空时,循环
    while (!isEmptyStack(stack)){
        // 退出栈顶元素,累加器+1
        int vex = deStack(stack);
        count++;
        printf("%2d", g->adjList[vex].data);
        //将退出的栈顶元素的各个邻接点的入度-1
        arc = g->adjList[vex].firstarc;
        while (arc){
            g->adjList[arc->adjvex].inDegree -= 1;
            //将退出后的度为0的顶点,加入栈中
            if(g->adjList[arc->adjvex].inDegree == 0){
                enStack(stack, g->adjList[arc->adjvex].data);
            }
            arc = arc->nextarc;
        }
    }
    if(count < g->vexnum){
        printf("\n图中存在环");
    }else{
        printf("\n不存在环");
    }
}
相关推荐
WWZZ20256 分钟前
快速上手大模型:机器学习3(多元线性回归及梯度、向量化、正规方程)
人工智能·算法·机器学习·机器人·slam·具身感知
东方佑1 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
西阳未落2 小时前
LeetCode——二分(进阶)
算法·leetcode·职场和发展
通信小呆呆2 小时前
以矩阵视角统一理解:外积、Kronecker 积与 Khatri–Rao 积(含MATLAB可视化)
线性代数·算法·matlab·矩阵·信号处理
CoderCodingNo3 小时前
【GESP】C++四级真题 luogu-B4068 [GESP202412 四级] Recamán
开发语言·c++·算法
一个不知名程序员www3 小时前
算法学习入门---双指针(C++)
c++·算法
Shilong Wang3 小时前
MLE, MAP, Full Bayes
人工智能·算法·机器学习
Theodore_10224 小时前
机器学习(6)特征工程与多项式回归
深度学习·算法·机器学习·数据分析·多项式回归
知花实央l4 小时前
【算法与数据结构】拓扑排序实战(栈+邻接表+环判断,附可运行代码)
数据结构·算法
lingling0094 小时前
机械臂动作捕捉系统选型指南:从需求到方案,NOKOV 度量光学动捕成优选
人工智能·算法