演算法筆記 問題 A 關鍵路徑

2021-10-05 15:52:31 字數 3553 閱讀 7571

圖的連線邊上的資料表示其權值,帶權值的圖稱作網。

圖可描述為頂點集為(a,b,c,d,e)

邊集及其權值為(始點,終點 權值):

a b 3

a c 2

b d 5

c d 7

c e 4

d e 6

網的源點是入度為0的頂點,匯點是出度為0的頂點。網的關鍵路徑是指從源點到匯點的所有路徑中,具有最大路徑長度的路徑。上圖中的關鍵路徑為a->c->d->e,其權值之和為關鍵路徑的長度為15。

本題的要求是根據給出的網的鄰接矩陣求該網的關鍵路徑及其長度。

輸入:第一行輸入乙個正整數n(1<=n<=5),其代表測試資料數目,即圖的數目

第二行輸入x(1<=x<=15)代表頂點個數,y(1<=y<=19)代表邊的條數

第三行給出圖中的頂點集,共x個小寫字母表示頂點

接下來每行給出一條邊的始點和終點及其權值,用空格相隔,每行代表一條邊。

輸出:第乙個輸出是圖的關鍵路徑(用給出的字母表示頂點, 用括號將邊括起來,頂點逗號相隔)

第二個輸出是關鍵路徑的長度

每個矩陣對應上面兩個輸出,兩個輸出在同一行用空格間隔,每個矩陣的輸出佔一行。

樣例:

輸入:25

6abcde

a b 3

a c 2

b d 5

c d 7

c e 4

d e 645

abcd

a b 2

a c 3

a d 4

b d 1

c d 3

輸出:(a,c)

(c,d)

(d,e)

15(a,c)

(c,d)

6

解題思路:

求關鍵路徑的題一般都是有向無環圖,且都是aoe(activity on edge)網

即圖中的頂點表示事件,圖中的邊表示活動。

關鍵路徑共有四部分需要求出來:

1、事件的最早發生時間

2、事件的最晚發生時間

3、活動的最早開始時間

4、活動的最晚開始時間

1、事件最早發生的時間,是從前往後順序計算,取最大值

即ve[v] = max

2、求出事件的最遲發生時間,是從後往前順序計算,取最小值

vl[top] = min

3、活動的最早開始時間 = 事件的最早發生時間

4、活動的最晚開始時間 = 事件的最晚發生時間 - 該活動所需時間

5、判斷活動的最早開始時間和最晚開始時間是否一樣,兩個時間相同則表示該活動為關鍵路徑上的活動。

下圖為王道考研2020的知識點:

注意:

該題在輸出關鍵路徑的時候,需要找出圖中的源點,不然可能不會通過測試資料。

下面為ac**:

/*

* @description: 關鍵路徑

*/#include

#include

#include

#include

#include

#include

using

namespace std;

struct path_node};

const

int path_max_num =20;

//最大邊數或者結點數

int n, x, y;

//n表示圖的數目,x表示結點數,y表示邊的數目

vector g[path_max_num]

;int in_depth[path_max_num]

;//入度陣列

string vertex;

//表示結點集合

int ve[path_max_num]

, vl[path_max_num]

;//事件最早發生時間,事件最晚發生時間

stack<

int> top_order;

//表示拓撲序列

vector<

int> path[path_max_num]

;//關鍵路徑

/** * @description: 找出 ch 在 vertex 中的位置

* @param : 當前結點的值

* @return: ch 的位置

*/int

find_id_in_vertix

(char ch)

//拓撲排序

bool

topology_sort()

}for

(int i =

0; i < x; i++)}

while

(!q.

empty()

)//求出事件最早發生的時間,此時取最大值,從前往後順序計算

//ve[v] = max

if(ve[top]

+ weight > ve[v])}

}if(top_order.

size()

!= x)

return

true;}

//求出關鍵路徑

intcritical_path()

//初始化 vl 陣列

int max_length =0;

for(

int i =

0;i < x;i++)}

fill

(vl, vl + path_max_num, max_length)

;//直接使用top_order求出事件的最遲發生時間

while

(!top_order.

empty()

)if(vl[v]

- weight < vl[top])}

}//初始化關鍵路徑的陣列

for(

int i =

0;i < x;i++

)//遍歷鄰接表的所有邊

//計算活動的最早開始時間和最晚開始時間

for(

int i =

0; i < x; i++)}

}//求出源點

int s;

for(

int i =

0;i < x;i++)}

while

(path[s]

.size()

)return max_length;

}int

main()

for(

int i =

0; i < y; i++

)int path_length =

critical_path()

; cout << path_length << endl;

}//system("pause");

return0;

}

關鍵路徑 CriticalPath演算法

關鍵路徑 即決定一項工程的完成時間的路徑。如下圖所示,是一輛汽車的生產流程,其中外殼 發動機 輪子等的生產過程都是可以並行進行的,但是傳送機生產需要的時間最長,而只有所有零部件生產完成才才能進行下一步,因此圖中用紅色加粗的那一條路徑即為該工程的關鍵路徑 即決定工程的實際完成時間的路徑 critica...

關鍵路徑 CriticalPath演算法

關鍵路徑 即決定一項工程的完成時間的路徑。如下圖所示,是一輛汽車的生產流程,其中外殼 發動機 輪子等的生產過程都是可以並行進行的,但是傳送機生產需要的時間最長,而只有所有零部件生產完成才才能進行下一步,因此圖中用紅色加粗的那一條路徑即為該工程的關鍵路徑 即決定工程的實際完成時間的路徑 critica...

關鍵路徑(學習筆記)

例圖如上圖,是乙個aoe網,點表示狀態,邊表示活動及其所需要的時間。為了求出關鍵路徑,我們使用一下演算法 這個過程是要從源點開始向匯點順推 v1是源點,其最早開始時間是0。v2 v3 v4最早時間分別是是6 4 5。對於v5而言,v2到v5所花費時間是6 1 7,而v3到v5所花費時間是4 1 5。...