当前位置: 首页>編程日記>正文

图的关键路径

图的关键路径

AOE网

AOE网是指在有向网中,如果用顶点表示事件,用有向边表示活动,边上的权值表示活动持续的时间,则称这样的有向网为弧表示活动的网(Acticity On Edge,AOE-网)。对仅有一个开始点和一个完成点的工程,可用AOE-网来表示,它可用来估算工程的完成时间。
在这里插入图片描述

  1. 网中仅有一个入度为0的顶点称为源点,表示工程的开始;仅有一个出度为0的顶点称为汇点,表示工程的结束。
  2. 只有在进入某一顶点的各有向边所代表的活动均已完成,该顶点所代表的事件才能发生;只有在某顶点所代表的事件发生后,从该顶点发出的所有有向边所代表的活动才能开始。
  3. 整个工程完成的时间为:从有向图的源点到汇点的最长路径,即关键路径
  4. 关键活动持续时间的总和(关键路径的长度)就是完成整个工程的最短工期

关键路径思想

最早发生时间(对于顶点)

概念:ve(j):v是顶点,即事件,e是early,即最早,j是顶点vj;

ve(j)是指事件(顶点)的最早发生时间
ve(j) = 从源点到顶点j的最长路径长度
ve(源点)=0;
ve(j)=Max{ve(k)+dut(<k,j>)},dut<k,j>表示活动持续的时间;
在这里插入图片描述
ve(j)的值可从源点开始按拓扑顺序向汇点递推。

最迟发生时间(对于顶点)

vl(k):v是顶点,即事件,l是late,即最迟,k是顶点vk
vl(k)是事件(顶点)的最迟发生时间
vl(k) = 从顶点k到汇点的最短路径长度
vl(汇点) = ve(汇点);
vl(k) = Min{vl(j) - dut<k,j>}
在这里插入图片描述
vl(j)的值可从汇点开始按逆拓扑顺序向源点递推。

最早开始时间和最晚开始时间(对于边)

  • 活动的最早开始时间
    ee(i) = ve(j)
    即:假设第i条弧为<j,k>,则ee(i)为第i项活动(弧)的最早开始时间;
  • 活动的最晚开始时间
    el(i) = vl(k)-dut(<j,k>)
    即:el(i)为第i项活动(弧)的最迟开始时间

在这里插入图片描述
ee(a1)=ee(V1-V2)=ve(V1)=0
el(a1)=el(V1-V2)=vI(V2)-2=0
ee(a6)=ee(V2-V6)=ve(V2)=2
el(a6)=el(V2-V6)=vI(V6)-8=6
……

如果这个活动的最早开始时间和最晚开始时间是相同的,那就说明活动不允许延迟。如果二者有差额,说明是有余量的,不影响整个工期。
关键活动是ee(aj)=el(aj)的活动

首先,求得每个事件的最早发生时间ve,再从汇点到源点求得最晚发生时间。求得每个活动的最早和最晚发生时间。然后找活动最早和最晚发生时间相同的,这就是整个工期里面不可以延期的关键活动。
在这里插入图片描述

关键路径算法实现

关键路径的求解步骤

  1. 按拓扑顺序求出每个事件的最早发生时间;
  2. 按逆拓扑序列求出每个事件的最迟发生时间;
  3. 计算每个活动的最早开始时间和最晚发生时间;
  4. 找出关键活动,即ee(ai)=el(ai)的活动。

改造拓扑排序算法

  • 求出各顶点的入度,并将入度为0的顶点入队;
  • 将各顶点的最早发生时间ve(i)初始化为0;
  • 只要队列不空,重复以下步骤:
    (1)将队头顶点j出队,同时压入栈T(逆拓扑)
    (2)将队头j的每一个邻接点k的入度减1,如果顶点k的入度减为0,则将顶点k入队;
    (3)根据顶点j的最早发生时间ve(j)和弧<j,k>的权值,更新顶点k的最早发生时间ve(k).

算法

int TopoSort_Ve(AdjList G, Stack*T){Queue Q; int indegree[MAXVEX], ye[MAXVEX]; int i,count=0,k; ArcNode *p; FindID(G, indegree); InitQueue(&Q); InitStack(&T); for(i=0;i<G.vexnum;i++)if(indegree[i]==0) EnterQueue(&Q,i); for(i=0:i<G. vexnum:i++) ve[i]=0;while(!lsEmpty(Q)){ 	DeleteQueue(&Q,&i); Push(T,i); count++; p=G.vertex[i].head; while(p!=NULL){ 	k=p->adjvex; if(--indegree[k]==0) EnterQueue(&Q,k);if(ve[j]+p->weight>ve[k]) ve[k]=ve[j]+p->weight; p=p->next; }}if(count<G. vexnum) return 0; else return 1;
}

关键路径的算法步骤:

  • 调用修改后的拓扑排序算法,求出每个事件的最早发生时间和逆拓扑序列栈T;
  • 将各顶点的vl(i)初始化为汇点的最早发生时间;
  • 只要栈不空,重复以下步骤:
    (1)将栈顶顶点j出队;
    (2)将栈顶j的每一个邻接点k,根据顶点k的vl(k)和弧<j,k>的权值,更新顶点j的最晚发生时间vl(j)。
    (3)扫描每一条弧计算其ee(i)和el(i),当ee(i)=el(i)输出该条弧。
int CriticalPath(AdjList G){ArcNode *p; int i,j,k,a, eei, eli, flag=0; int vl[MAXVEX];//存每一个事件的最晚发生时间Stack S; if(!TopoSort_Ve(G,&T)) return(0); for(i=0;i<G.vexnum:i++)vl[i]=ve[G.vexnum-1];while(!IsEmpty(&T)){pop(T,&j); //出栈顶元素p=G.vertex[j].head; while(p){//找邻接点k=p->adjvex;a=p->weight; if(vl[k])-a<vl[i}) vl[j]=vl[k]-a; p=p->next;}}for(i=0;i<vexnum;i++){p=G.vextex[i].head; while(p){k=p->adjvex;a=p->weight; eei=ve[j]; eli=vl[k]-a; if(eei==eli) flag=1; p=p->next;}}
}


https://www.fengoutiyan.com/post/13998.html

相关文章:

  • 关键路径网络图怎么画
  • 两点间路径算法
  • 什么是路径图
  • 连通图边和点的关系
  • 关键路径的例子
  • 任何次序遍历都相同的二叉树
  • 关键路径是最长的还是最短的
  • 哈夫曼树带权路径长度怎么算
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機