圖的連線邊上的資料表示其權值,帶權值的圖稱作網。
圖可描述為頂點集為(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。...