`

关键路径(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
分享到:
评论

相关推荐

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

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

    关键路径 AOE 数据结构 MFC

    本程序为用MFC做的可视化界面的程序 实现了求关键路径 的功能

    数据结构关键路径AOE网

    用字符文件提供数据建立AOE网络邻接表存储结构,编写程序,输出一条关键路径以 及工程的最短完成时间。输出的关键路径用该路径上全部顶点的拓序有序序列表示。

    关键路径AOE

    关键路径

    AoE算法求解关键路径

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

    C语言求AOE网关键路径

    这个程序为实现AOE求关键路径的程序,工具为VC,语言为C,内有readme,

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

    有良好界面的JAVA编写的AOE网络求取关键路径,比较完善

    AOE 求关键路径程序

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

    求AOE网络关键路径

    用C++实现的代码,求AOE网络的关键路径,有详细注释

    C++ 关键路径

    C++ 关键路径 关键路径 AOE suanfa 算法

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

    【摘 要】介绍AOE网中关键路径的相关概念,通过算法描述和实例,探讨基于拓扑排序求解、P矩阵的求解和广 度优先搜索遍历(BFS)方法三种算法,求解AOE网中关键路径的实现过程,并进一步从算法的时间复杂度、数据结 构形式...

    数据结构 AOE网关键路径

    数据结构课本上的求关键路径的算法,注释详细,应该对着书看都能懂的,基本都是书上的思路

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

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

    AOE 求关键路径 程序

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

    AOE关键路径 邻接表存储

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

    AOE关键路径.rar

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

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

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

    AOE_关键路径 源程序

    图的应用 关于AOE网关键路径的算法 内容:按照图的“邻接表”存储结构表示AOE网,实现求其关键路径的算法

    networkx-AOE关键路径算法-v1.py

    用networkx解决关键路径的问题并把图形画出来,但目前只能画出来节点,没画出边上权的值,待小编再研究一下networkx的用法,写出v2版带边权重的代码。

Global site tag (gtag.js) - Google Analytics