基于邻接表的拓扑排序 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不存在环");
    }
}
相关推荐
njidf36 分钟前
C++中的访问者模式
开发语言·c++·算法
C_Si沉思1 小时前
C++中的工厂模式变体
开发语言·c++·算法
C羊驼1 小时前
C语言学习笔记(十五):预处理
c语言·经验分享·笔记·学习·算法
m0_569881471 小时前
C++中的适配器模式变体
开发语言·c++·算法
NAGNIP1 小时前
面试官:正则化都有哪些经典的方法?
算法·面试
Theodore_10222 小时前
深度学习(12)正则化线性回归中的偏差与方差调试
人工智能·深度学习·算法·机器学习·线性回归
m0_569881472 小时前
跨语言调用C++接口
开发语言·c++·算法
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #295:数据流的中位数(双堆法、有序列表、平衡树等多种实现方案详解)
算法·leetcode·优先队列··数据流·中位数·java 面试题
x_xbx3 小时前
LeetCode:215. 数组中的第K个最大元素
数据结构·算法·leetcode
黎阳之光3 小时前
AI数智筑防线 绿色科技启新篇——黎阳之光硬核技术赋能生态安全双升级
大数据·人工智能·算法·安全·数字孪生