进阶数据结构图——关键路径(四)

四、关键路径

4.1 关键路径相关概念

  • AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,我们称之为AOE网(Activity On Edge Network)

我们把路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最大长度的路径叫关键路径,在关键路径上的活动叫关键活动

4.2 关键路径代码实现

cpp 复制代码
int *etc,*ltv;  // 事件最早发生时间和最迟发生时间数组
int *stack2;    // 用于存储拓扑排序的栈
int top2;       // 用于stack2的指针

// 拓扑排序
int TopologicalSort(GraphAdjList GL)
{    // 若GL无回路,则输出拓扑排序并返回1,若有则返回0
    EdgeNode* e;
    int i,k,gettop;
    int top = 0;
    int count = 0;
    int *stack;
    stack = (int*)malloc(GL->numVertexes* sizeof(int));
    for (i = 0; i<GL->numVertexes;i++)
        if (GL->adjList[i].in == 0)
            stack[++top] = i;
    top2 = 0;
    etv = (int*)malloc(GL->numVertexes*sizeof(int));
    for (i = 0;i<GL->numVertexes;i++)
        etv[i] = 0;
    stack2 = (int*)malloc(GL->numVertexes*sizeof(int));
    while(top != 0)
    {
        gettop = stack[top--];
        count++;
        stack2[++top2] = gettop;
        for ( e = GL->adjList[gettop].firstedge;e;e = e->event)
        {
            k = e->adjvec;
            if (!(--GL->adjList[k].in))
                stack[++top] = k;
            if ((etv[gettop] + e->weight) > etv[k])
                etv[k] = etv[gettop] + e->weight;
        }
    }
    if (count < GL->numVertexes)
        return ERROR;
    else
        return OK;
}

下面来看求关键路径的算法代码:

cpp 复制代码
// 求关键路径,GL为有向网,输出G的各项关键活动
void CriticalPath(GraphAdjList GL)
{
    EdegNode* e;
    int i,gettop,k,j;
    int ete,lte;
    TopologicalSort(GL);
    ltv = (int*)malloc(GL->numVectexes*sizeof(int));
    for (i = 0;i<GL->numVertexes;i++)
        ltv[i] = etv[GL->numVertexes-1];
    while(top2 != 0)
    {
        gettop = stack2[top2--];
        for (e = GL->adjList[gettop].firstedge;e;e = e->next)
        {
            k = e->adjvex;
            if (ltv[k] - e->weight < ltv[gettop])
                ltv[gettop] = ltv[k] - e->weight;
        }
    }
    for (j = 0;j<GL->numVertexes;j++)
    {
        for (e = GL->adjList[j].firstedge;e;e = e->next)
        {
            k = e->adjvex;
            ete = etv[j];
            lte = ltv[k] - e->weight;
            if (ete == lte)
                printf("<v%d - v%d> length: %d \n", 
                        GL->adjList[j].data,GL->adjList[k].data,e->weight);   
        }
    }
}
相关推荐
午彦琳1 天前
2026.9.17
数据结构·算法·leetcode
All for pursuit.1 天前
【链表-9】146.LRU缓存
数据结构·c++·算法·leetcode
彧azz1 天前
图的最短路径:Dijkstra与Floyd算法
数据结构·笔记·学习
智购科技自动售卖机厂家1 天前
设备一到夏天就频繁跳闸,从启动电流追到压缩机电容~YH
数据结构·人工智能·python·eclipse
Logic1011 天前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
鹿角片ljp1 天前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
Logic1011 天前
C语言/数据结构位运算题解:异或XOR找出数据表中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
wabs6661 天前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法
qianyanwanyv1 天前
数据结构概念
数据结构