前言:首先關鍵路徑是針對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...