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

四、关键路径

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);   
        }
    }
}
相关推荐
码完就睡9 小时前
数据结构——红黑树
数据结构
码爸9 小时前
数据结构详细介绍
数据结构
CQU_JIAKE13 小时前
10.9【A】
数据结构
第25小时记录13 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·python
Logic10117 小时前
C语言/数据结构数位DP题解:平滑排列数字统计——区间内相邻位差不超过K的数字个数
c语言·数据结构·动态规划·时间复杂度·数位dp·算法题·前导零处理
海海不掉头发17 小时前
图论及其应用_课堂笔记整理_CSDN博客
笔记·图论
wang090718 小时前
硬着头皮学数据结构和算法之Myers算法
数据结构·算法
垆边人似月.18 小时前
华为机试题 :最长递增子序列题目
数据结构·c++·算法·华为
yi0111 天前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表