当前位置: 首页>編程日記>正文

关键路径C++实现

关键路径C++实现

AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的持续时间,称这样的有向图叫做边表示活动的网,简称AOE网。AOE网中没有入边的顶点称为始点(或源点),没有出边的顶点称为终点(或汇点)。

AOE网的性质

⑴ 只有在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始;

⑵ 只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。

关键路径:在AOE网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径称为关键路径。

关键活动:关键路径上的活动称为关键活动。关键活动:e[i]=l[i]的活动

  由于AOE网中的某些活动能够同时进行,故完成整个工程所必须花费的时间应该为始点到终点的最大路径长度。关键路径长度是整个工程所需的最短工期。

与关键活动有关的量

⑴ 事件的最早发生时间ve[k]

  ve[k]是指从始点开始到顶点vk的最大路径长度。这个长度决定了所有从顶点vk发出的活动能够开工的最早时间。

    

⑵ 事件的最迟发生时间vl[k]

  vl[k]是指在不推迟整个工期的前提下,事件vk允许的最晚发生时间。

    

 

⑶ 活动的最早开始时间e[i]

  若活动ai是由弧<vk vj>表示,则活动ai的最早开始时间应等于事件vk的最早发生时间。因此,有:e[i]=ve[k]

⑷ 活动的最晚开始时间l[i]

  活动ai的最晚开始时间是指,在不推迟整个工期的前提下, ai必须开始的最晚时间。若ai由弧<vkvj>表示,则ai的最晚开始时间要保证事件vj的最迟发生时间不拖后。因此,有:l[i]=vl[j]-len<vkvj>

 

示例:

  

所以:

具体的实现代码如下:

#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
const int maxn = 1000;
int n;
int ve[maxn], vl[maxn];
struct Node
{int v, w;
}node;
int inDegree[maxn] = { 0 };
stack<int> topOrder;
vector<Node> G[maxn];
vector<int> pre[maxn];
bool topologicalSort()
{queue<int> q;int c = 0;for (int i = 0; i < n; i++){if (inDegree[i] == 0)q.push(i);}while (!q.empty()){int u = q.front(); c++;topOrder.push(u);q.pop();for (int i = 0; i < G[u].size(); i++){int v = G[u][i].v, w = G[u][i].w;inDegree[v]--;if (inDegree[v] == 0)q.push(v);if (ve[u] + w > ve[v])ve[v] = ve[u] + w;}}return c == n ? true : false;
}
vector<int> path;
void DFS(int s, int e)
{if (s == e){path.push_back(s);for (int i = path.size() - 1; i >= 0; i--){printf("%d", path[i]);if (i > 0)printf("->");else printf("\n");}path.pop_back();return;}path.push_back(e);for (int i = 0; i < pre[e].size(); i++){DFS(s, pre[e][i]);}path.pop_back();
}
int criticalPath()
{fill(ve, ve + n, 0);if (!topologicalSort()){return -1;}fill(vl, vl + n, ve[n - 1]);while (!topOrder.empty()){int u = topOrder.top();topOrder.pop();for (int i = 0; i < G[u].size(); i++){int v = G[u][i].v, w = G[u][i].w;if (vl[v] - w < vl[u]){vl[u] = vl[v] - w;}}}printf("所有的关键活动如下所示:\n");for (int u = 0; u < n; u++){for (int i = 0; i < G[u].size(); i++){int v = G[u][i].v, w = G[u][i].w;int e = ve[u], l = vl[v] - w;if (e == l){printf("%d->%d\n", u + 1, v + 1);//输出时加1以还原输入时做出的改变pre[v + 1].push_back(u + 1);}}}printf("所有的关键路径如下所示:\n");DFS(1, n);return ve[n - 1];
}int main()
{freopen("i.txt", "r", stdin);//键盘输入流重定向为i.txt文件输入流int m;scanf("%d %d", &n,&m);//n为点数,m为边数int a, b, w;for (int i = 0; i < m; i++){scanf("%d%d%d", &a, &b, &w);//a、b为事件,w为ab这条边所表示的活动耗费的时间node.v = b-1; node.w = w;G[a-1].push_back(node);//实际存储时为了方便a、b都减1}printf("关键路径长度为:%d\n",criticalPath());return 0;
}
/*
输入为(即i.txt内容):
9 11
1 2 6
1 3 4
1 4 5
2 5 1
3 5 1
4 6 2
5 7 9
5 8 7
6 8 4
7 9 2
8 9 4
*/


https://www.fengoutiyan.com/post/13997.html

相关文章:

  • c获取文件路径
  • 求关键路径的算法
  • 关键路径长度
  • 图的关键路径
  • c 获取当前路径
  • 拓扑排序关键路径
  • 关键路径和关键活动
  • 数据结构关键路径怎么求
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機