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

四、关键路径

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 小时前
单调栈和单调队列
数据结构
UIU1145 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
黎相思8 小时前
BTree
数据结构·b树·b+树
UIU11418 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
niyongsheng21 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
叉烧滑蛋1 天前
B站台湾大学郭彦甫|MATLAB 学习笔记|04 变量与档案存取
数据结构
j7~1 天前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
not coder1 天前
一文讲通--从树到红黑树
数据结构·算法
爱吃香菜的初学者1 天前
八.数据结构——哈希表(1)
数据结构·散列表
二十七日秋1 天前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法