關鍵路徑求解

2021-08-21 11:16:20 字數 2592 閱讀 5999

前言:首先關鍵路徑是針對dag圖來說的,我們通常用aoe網來表示乙個工程的進行過程,aov網可以轉換為aoe網,aoe網是沒有環的,通常關鍵路徑求解需要弄清楚以下四個概念:

事件最早發生時間ve[u]、事件最晚發生時間vl[u]

活動最早發生時間e[r]、活動最晚發生時間l[r]

在aoe網(activity on edge,用帶權的邊表示活動,用頂點表示事件的有向圖)中,【其實乙個事件(頂點)僅表示乙個中介狀態】首先,我們要求出每個事件(頂點)的最早發生時間ve[u]和最晚發生時間vl[u],「事件最早發生時間」可用拓撲排序來進行求解;而事件的最晚發生時間可以用逆拓撲來求解。以上兩個求解出來後,就可以計算活動最早發生時間e[r]和活動最晚發生時間l[r]了,他們的關係如下:

**如下:

#include"stdafx.h"

#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 500;

int vertexnum, edgenum;

struct node ;

vectoradj[maxn];//鄰接表儲存dag圖

int innode[maxn] = ;//記錄每個結點的入度

queueq;

stacks;//運用乙個棧,到時候實現逆拓撲

int ve[maxn];//事件發生的最早時間

int vl[maxn];//事件發生的最晚時間

bool topologicalsort()

} while (!q.empty())

if (ve[u] + adj[u][i].weight > ve[v])

} }if (s.size() == vertexnum) return true;

else return false;//否則拓撲失敗,說明此圖是存在環,不是dag圖

}void antitopologicalsort()

} }}int main()

criticalpath();//關鍵路徑

return 0;

}

執行結果如下:

補充:其實求aoe網中的關鍵路徑就是求dag最長路路徑,所以對於以上求dag最長路還有一種更簡單的辦法:利用動態規劃思想去解決,令dp[i]表示以i為源點的最長路,如果要求dp[i],就必須求出以源點i出發能夠到達的頂點j的dp[j],而dp[j]的求解又是一樣的思路,其中dag圖中出度為0的點v,他的dp[v]就是為0了,很顯然,求解dp陣列可以利用遞迴去求解。當求出所有的dp[i],其中dp值最大的就是dag圖的最長路徑長度,**如下:

以下演算法實現的功能是:求出最長路徑長度和輸出最長路徑序列

#include"stdafx.h"

#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 500;

int vertexnum, edgenum;

struct node ;

vectoradj[maxn];//鄰接表儲存dag圖

int outnode[maxn] = ;//記錄每個頂點的出度

int dp[maxn];

void init() }}

vectorsumpath[maxn];//sumpath[i]陣列表示:以i為源點的dag最長路路徑序列

int path[maxn];//存放dag最長路路徑序列

int dfs(int index)

} return dp[index];

}int main()

init();//初始化

for (int i = 0; i < vertexnum; i++)

int maxdp = -1;//記錄最大的dp[i]的值

int longestindex;//表示dag最長路路徑是以longestindex為源點

for (int i = 0; i < vertexnum; i++)

if (maxdp < temp)

} cout << "關鍵路徑長度:" << maxdp << "\n";

cout << "關鍵路徑序列為:";

for (int i = 0; i < sumpath[longestindex].size(); i++)

return 0;

}

執行結果如下:

hdu 4109 (求解關鍵路徑長度)

關於求解哪些邊是關鍵路徑,可以參考我的這篇部落格 這題只是上面這個 的精簡版,只求了長度,沒求哪些是關鍵路徑,所以只貼了個 include using namespace std const int maxn 1e3 5 const int inf 0x3f3f3f3f int n,m int mp...

C語言實現「關鍵路徑」的求解

儘管是用c 編譯的,但程式中沒有應用什麼c 特性,應該算是c語言編寫吧。一 概述 工程上常常用乙個有向無環圖來代表乙個專案 如下圖 以節點表示某個事件,以邊表示活動,邊上的數字表示活動的持續時間。在工程分析上,常常需要找到一條 關鍵路徑 即此路徑直接決定專案的持續時間。二 演算法描述 為求出關鍵路徑...

Codeup關鍵路徑 關鍵路徑

時間限制 1 sec 記憶體限制 128 mb 提交 261 解決 90 提交 狀態 討論版 命題人 外部匯入 描述 圖的連線邊上的資料表示其權值,帶權值的圖稱作網。上圖可描述為頂點集為 a,b,c,d,e 邊集及其權值為 始點,終點 權值 a b 3 a c 2 b d 5 c d 7 c e 4...