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

四、关键路径

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);   
        }
    }
}
相关推荐
孙克旭_31 分钟前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
Chester_19991 小时前
CSP202206C.角色授权
开发语言·数据结构·c++·蓝桥杯
旖旎夜光2 小时前
LeetCode 238:除自身以外数组的乘积(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
一条大祥脚2 小时前
26杭电暑期第八场(后半)快读|快写|tarjan|路径DP|mex转化|扫描线|前缀和|二分图
数据结构·算法·tarjan·杭电多校·强联通分量·动态规划dp
Chester_199911 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
专注仿真16 小时前
Spring AI 实现智能对话系统项目指南
数据结构·spring·机器学习
间歇性努力持续性发呆的野生快乐选手16 小时前
高级数据结构:树状数组
数据结构
云淡风轻~窗明几净20 小时前
宇宙管理学猜想
算法·图论
每周报刊21 小时前
竞速座舱级视界:爱攻 AGP497UCZD 超宽 QDOLED 显示器解析
数据结构·游戏·计算机外设