`

关键路径(AOE)

 
阅读更多

前面这段话是引用别人的,后面代码是自己写的,有待完善:

 

求关键路径的关键如下:

1、每个顶点所代表的事件的最早和最迟发生时间

2、每条弧所代表的活动的最早和最迟开始时间

事件的最早发生时间:ve[源点]=0,ve[k]=MAX{ve[j]+dut(<j,k>)},即在k前面的事件的最早发生时间加上那些事件到k所需要的时间所得的值中取最大值。

事件的最迟发生时间:vl[汇点]=ve[汇点],vl[j]=MIN{vl[k]-dut(<j,k>)},即在j后面的事件的最迟发生时间减去j到那些事件所需的时间所得的值中取最小值。

活动的最早开始时间:ee[i]=ve[j],即该项活动最早开始时间与该项活动的开始事件的最早时间相同

活动的最迟开始时间:el[i]=vl[k]-dut(<j,k>),即活动的最迟开始时间等于该项活动的结束事件的最迟发生时间减去该项活动持续的时间。

 

测试用例图示:


代码:

#include <iostream>
#include <cstdio>
using namespace std;

int n;          //顶点数 
int m;          //有向边数 
int w[1001][1001];         //有向图权值 
int indegree[1001];            //顶点入度 

int queue[1001];               //已经找到的拓扑序列:从队首到队尾按照拓扑排序 
int l=0;       //逐个将已经找到的拓扑序列中的顶点queue[l]从有向图中删除掉(包括删除它的出边) 
int r=0;       //拓扑子序列长度 :queue[r]为目前找到的拓扑子序列最后一个顶点 

int ve[1001];                //顶点(事件) 的最早时间 
int pi[1001];  //关键路径的前驱图 
int path[1001];                    

/*
  测试数据: (见图 )
            5 6
            1 3 3
            1 2 4
            2 5 3
            3 4 1
            3 5 2
            4 5 3
*/
void init(){
     int i,a,b,c;
     scanf("%d%d",&n,&m);
     for(i=1;i<=m;i++){
         scanf("%d%d%d",&a,&b,&c);
         w[a][b]=c;
         indegree[b]++;
     }
}

/* 顶点i加入拓扑序列 */
inline void enQueue(int i){
       queue[++r]=i;
}
/* 从有向图中删除顶点v  -->  拓扑排序时逐个删除找到拓扑序的顶点v */
inline void del(int v){
       int i;
       for(i=1;i<=n;i++){
           if(w[v][i]){
               indegree[i]--;
               if(!indegree[i])
                   enQueue(i);
           }
       }
}

/* 拓扑排序*/
void topo(){
     //找拓扑序列的第一个顶点(不唯一) 
     for(int i=1;i<=n;i++){
         if(!indegree[i])
             enQueue(i);
     }
     
     while(r<n){
         l++;
         del(queue[l]);
     }
}

/*
  关键路径由杜邦公司发明,决定整个项目的工期。
  AOE网:用顶点表示事件,用弧表示活动,弧的权表示活动的持续时间。 对于一个工程,有一个顶点表示整个工程开始(事件),另一个顶点表示这个工程结束(事件) 
*/
void criticalPath(){
     int i,j;
     memset(ve,0,sizeof(ve));
     /*
       ve[i]=max{v[j]+w[j][i]|w[j][i]>0}
     */ 
     for(i=1;i<=n;i++){                 //queue[i]: queue[1~n]按拓扑序排列的顶点 
         for(j=1;j<=n;j++){        //i的所有直接前驱 
             if ( (w[j][queue[i]]>0) && (ve[j]+w[j][queue[i]]>ve[queue[i]]) ){
                 ve[queue[i]]=ve[j]+w[j][queue[i]];
                 pi[queue[i]]=j;
             }
         }
     }
}

/*打印以i为终点的关键路径(包括i)*/
void print(int i){
     if(i==1){
         cout<<1;
         return;
     }
     print(pi[i]);
     cout<<"-->"<<i;
}

void print(){
     printf("总工期: %d\n",ve[n]); 
     
     printf("一条关键路径: "); 
     print(n);
}

int main(){
    init();
    topo();
    criticalPath();
    print();
    
    system("pause");
    return 0;
}
  • 大小: 7 KB
分享到:
评论

相关推荐

    关键路径 AOE 数据结构 MFC

    AOE(Activity On Edge)网络图是表示关键路径的一种图形化方法,其中每个节点代表一个任务,每条边代表任务间的先后关系和所需时间。 数据结构在实现关键路径算法中扮演着核心角色。主要涉及以下几个关键数据结构...

    用C/C++写的求关键路径AOE

    程序+报告+说明 功能: 0 (创建一个工程) 1 (从文本导入一个工程) 2 (用邻接表输出工程及输出工程的关键路径)

    数据结构关键路径AOE网

    在这个项目中,我们将使用数据结构中的图来表示关键路径问题,并通过读取字符文件来构建AOE(Activity On Edge)网络,这是一种特殊的有向无环图(DAG),其中边表示活动,节点表示事件。 首先,我们需要理解AOE...

    关键路径AOE

    关键路径

    C语言求AOE网关键路径

    标题中的"C语言求AOE网关键路径"是指利用C语言编程来解决活动网络图(Activity On Edge, AOE)中的关键路径问题。关键路径是项目管理中的一个重要概念,它表示了从项目开始到结束的最长路径,决定了项目的最短完成...

    求AOE网络关键路径

    本压缩包文件包含了一个用C++编程语言实现的AOE网络关键路径求解器。C++是一种强类型、静态类型的编程语言,因其高效性和灵活性而常被用于系统级编程和大型软件开发。在C++中实现AOE网络的关键路径算法,可以提供...

    Java 编写的AOE网络求关键路径

    Java编程实现AOE(Arc-Of-Event)网络来寻找关键路径是一种常见的项目管理和工程计划优化技术。AOE网络是一种图形表示法,用于表示任务之间的依赖关系和它们所需的时间,其中节点代表活动,边代表活动之间的顺序关系。...

    AoE算法求解关键路径

    传统AoE算法求解关键路径的C++代码实现

    AOE 求关键路径程序

    本程序实现了根据你所输入的数据建图,并利用AOE求出最长路径长度,并标明关键路径

    关于AOE网中关键路径求解算法的研究

    ### 关于AOE网中关键路径求解算法的研究 #### 摘要 本文主要讨论了AOE网中关键路径的求解问题及其相关的几种算法。AOE网(Activity On Edge Network)是一种特殊的有向无环图,用来表示工程项目中的活动与依赖关系...

    数据结构 AOE网关键路径

    在AOE网中,关键路径是从起点到终点的最长路径,所有非关键路径的延迟都不会影响项目的总完成时间,而关键路径上任何活动的延迟都将导致项目延期。 求解关键路径通常涉及以下步骤: 1. **拓扑排序**:首先,对AOE...

    邻接表表示的AOE网与邻接矩阵表示的AOE网求解AOE网的关键路径方法

    在Windows7 64位+VS2015上运行求解AOE网关键路径的算法,邻接表表示的AOE网提示网中有回路,邻接矩阵表示的AOE网显示正确的信息?使用的算法是一样的,两种方法的相关类的接口函数也一致,为什么会出现这种问题?

    教你轻松计算AOE网关键路径1

    AOE网的关键路径计算旨在找出决定项目总时长的路径,以便进行有效的资源分配和进度规划。 计算AOE网的关键路径主要涉及以下几个步骤: 1. **最早发生时间Ve(j)**: 从起点开始,向前遍历图中的所有顶点,计算每个...

    AOE 求关键路径 程序

    本程序用c#编写,实现了建图,利用AOE实现求解关键路径问题,并标明那些路径为关键路径

    AOE关键路径 邻接表存储

    C++数据结构 AOE CPP源文件 采用数据结构中的AOE方法对图的关键路径进行计算 :建立邻接表

    AOE网活动和关键路径

    在文档"AOE与关键路径.doc"中,可能详细阐述了AOE网的概念、计算方法以及关键路径的识别过程,并可能包含了一些实例分析和代码示例。 总的来说,AOE网分析和关键路径的计算是项目管理中非常重要的工具,它们可以...

    AOE关键路径.rar

    关键路径通常(但并非总是)是决定项目工期的进度活动序列。它是项目中最长的路径,即使很小浮动也可能直接影响整个项目的最早完成时间。关键路径的工期决定了整个项目的工期,任何关键路径上的终端元素的延迟在浮动...

    AOE-net.rar_AOE_AOE network_AOE关键活动_AOE网_关键路径

    该程序能实现的功能,若活动图有回路则无法计算出关键路径,即解决了判断工程的可行性问题。通过对工程活动的输入,可以建立任意的AOE网进行判断。对于输入的网,可以计算出每个活动的最早开始时间,最迟开始时间...

    AOE_关键路径 源程序

    关键路径是AOE网中最重要的一条路径,它定义了项目中最长的完成序列,决定了整个项目的最短完成时间。 关键路径算法通常分为两个步骤:拓扑排序和计算最早与最晚时间。拓扑排序是将无环图的所有节点按照没有前驱...

Global site tag (gtag.js) - Google Analytics