日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

AOE网的关键路径的计算

發(fā)布時(shí)間:2025/3/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AOE网的关键路径的计算 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

求關(guān)鍵路徑,只需理解頂點(diǎn)(事件)和邊(活動(dòng))各自的兩個(gè)特征屬性以及求法即可:

   ?? 先根據(jù)首結(jié)點(diǎn)的Ve(j)=0由前向后(正拓?fù)湫蛄?#xff09;計(jì)算各頂點(diǎn)的最早發(fā)生時(shí)間

   ?? 再根據(jù)終結(jié)點(diǎn)的Vl(j)等于它的Ve(j)由后向前(逆序拓?fù)?#xff09;依次求解各頂點(diǎn)的最晚發(fā)生時(shí)間

   ?? 根據(jù)邊的ee(i)等于它的發(fā)出頂點(diǎn)的Ve(j)計(jì)算各邊的最早開(kāi)始時(shí)間(最早開(kāi)始,對(duì)應(yīng)最早發(fā)生)

   ?? 根據(jù)邊的ll(i)等于它的到達(dá)頂點(diǎn)的Vl(j)減去邊的權(quán)值計(jì)算各邊的最晚開(kāi)始時(shí)間(最晚開(kāi)始,對(duì)應(yīng)最晚發(fā)生)

#include<iostream>
#include
<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<stack> #define MAX_NODE_NUM 100 using namespace std;int first[MAX_NODE_NUM]; typedef struct EDGE{int u, v, w;int nextarc;EDGE(){}EDGE(int u, int v, int w, int nextarc){this->u = u;this->v = v;this->w = w;this->nextarc = nextarc;} } edge;vector<edge> g; stack<int> s, t;//s存儲(chǔ)入度為零的節(jié)點(diǎn), t存儲(chǔ)圖的拓?fù)湫蛄械捻旤c(diǎn)棧 int ve[MAX_NODE_NUM];//事件的最早發(fā)生時(shí)間, 或者 活動(dòng)ai的最早發(fā)生時(shí)間 int vl[MAX_NODE_NUM];//事件的最晚發(fā)生時(shí)間 int degIn[MAX_NODE_NUM];//記錄每一個(gè)節(jié)點(diǎn)的入度 int tag[MAX_NODE_NUM][MAX_NODE_NUM]; int n, m;//分別為圖的節(jié)點(diǎn)的個(gè)數(shù),和邊的個(gè)數(shù) bool topoSort(){memset(ve, 0, sizeof(ve));int cnt = 0;//記錄 for(int i=1; i<=n; ++i)if(degIn[i] == 0)s.push(i);while(!s.empty()){int u = s.top();s.pop();t.push(u);++cnt;for(int e=first[u]; ~e; e=g[e].nextarc){int v = g[e].v;int w = g[e].w;if(--degIn[v] == 0) s.push(v);if(ve[u] + w > ve[v]) ve[v] = ve[u] + w;}}if(cnt < n) return false;//該有向圖存在回路 return true; }bool criticalPath() {//尋找關(guān)鍵路徑 if(!topoSort()) return false; for(int i=1; i<=n; ++i)vl[i] = ve[t.top()];while(!t.empty()){//逆序拓?fù)渑判?#xff0c;計(jì)算每個(gè)節(jié)點(diǎn)的最晚的發(fā)生時(shí)間 int u = t.top();t.pop();for(int e=first[u]; ~e; e=g[e].nextarc){int v = g[e].v;int w = g[e].w;if(vl[v] - w < vl[u]) vl[u] = vl[v] - w;}}for(int i=1; i<=n; ++i){//輸出關(guān)節(jié)點(diǎn) int ee = ve[i];//活動(dòng)ai的最早的發(fā)生時(shí)間 for(int e=first[i]; ~e; e=g[e].nextarc) {int v = g[e].v;int w = g[e].w;int ll = vl[v]-w;//活動(dòng)ai的最晚的發(fā)生時(shí)間 ll == ee ? printf(" * ") : printf(" ");printf("%d %d %d %d %d\n", i, v, w, ee, ll);//分別為 u, v, w(這條邊所對(duì)應(yīng)的活動(dòng)), 活動(dòng)最早發(fā)生時(shí)間和最晚發(fā)生時(shí)間 }} return true; }void dfs(int u){for(int e=first[u]; ~e; e=g[e].nextarc) {int ee = ve[u];int v = g[e].v;int w = g[e].w;dfs(v);if(tag[u][v]) continue;tag[u][v] = 1;if(vl[v]-w < vl[u]) vl[u] = vl[v]-w;int ll = vl[v]-w;//活動(dòng)au的最晚的發(fā)生時(shí)間 ll == ee ? printf(" * ") : printf(" ");printf("%d %d %d %d %d\n", u, v, w, ee, ll);} }bool criticalPathx() {//尋找關(guān)鍵路徑,利用dfs可以 if(!topoSort()) return false; for(int i=1; i<=n; ++i)vl[i] = ve[t.top()];dfs(1);//默認(rèn)1節(jié)點(diǎn)為源點(diǎn) }void addEdge(int u, int v, int w){edge e(u, v, w, first[u]);first[u] = g.size();g.push_back(e); } int main(){printf("請(qǐng)輸入圖的節(jié)點(diǎn)的個(gè)數(shù)和邊的個(gè)數(shù):\n");scanf("%d%d", &n, &m);memset(first, -1, sizeof(first));while(m--){int u, v, w;scanf("%d %d %d", &u, &v, &w);addEdge(u, v, w);++degIn[v];}//criticalPath();/*輸出結(jié)果: * 1 3 2 0 01 2 3 0 12 4 2 3 42 5 3 3 43 6 3 2 5* 3 4 4 2 2* 4 6 2 6 65 6 1 6 7*/criticalPathx();/*輸出結(jié)果:3 6 3 2 5* 4 6 2 6 6* 3 4 4 2 2* 1 3 2 0 02 4 2 3 45 6 1 6 72 5 3 3 41 2 3 0 1*/return 0; }

輸入數(shù)據(jù):

6 8
1 2 3
2 5 3
5 6 1
2 4 2
4 6 2
3 4 4
1 3 2
3 6 3

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/4652989.html

總結(jié)

以上是生活随笔為你收集整理的AOE网的关键路径的计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。