关键路径算法以及实现

最近一直被概率论所虐,今天要交作业于是乎昨天急急忙忙的写完了,里面有个关于关键路径的东西,以前没有见过也感觉没啥用所以一直拖到现在才学。=-=拖延症啊。

什么叫关键路径。

在一个有向图中,如果用顶点表示事件,弧表示活动,弧上对应的权值表示活动持续的时间,那么称这个有向图为AOE网,常用于估算工程的完成时间。

(AOV网:在一个有向图中,如果以顶点表示活动,用顶点之间的关系来表示活动的先后关系,那么称此有向图为AOV网,用于分析工程各项子任务的完成先后顺序,即拓扑排序。)

关键路径为AOE网中从顶点到汇点路径长度最长的路径称为关键路径。

关键路径中主要有以下术语:
活动开始的最早时间e[i]
活动开始的最晚时间l[i]
事件开始的最早时间ve[i]
事件开始的最晚时间vl[i]

其中,关键活动就是找那些e[i]=l[

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关键路径算法(Critical Path Method,CPM)是一种用于确定项目关键路径的方法,它是一种基于网络图的算法。下面是一个基于邻接表的 C++ 实现: ```C++ #include <iostream> #include <vector> #include <queue> #include <cstring> #include <algorithm> using namespace std; // 邻接表存储图 struct edge { int to, weight; edge(int to, int weight) : to(to), weight(weight) {} }; const int MAXN = 1005; vector<edge> G[MAXN]; // 存储图 int inDegree[MAXN]; // 存储节点的入度 int earliest[MAXN]; // 存储节点的最早开始时间 int latest[MAXN]; // 存储节点的最晚开始时间 int path[MAXN]; // 存储关键路径 bool vis[MAXN]; // 标记节点是否被访问 // 拓扑排序,求每个节点的最早开始时间 void topoSort(int n) { queue<int> q; memset(earliest, 0, sizeof(earliest)); for (int i = 1; i <= n; i++) { if (inDegree[i] == 0) { q.push(i); earliest[i] = 0; } } while (!q.empty()) { int u = q.front(); q.pop(); for (int i = 0; i < G[u].size(); i++) { int v = G[u][i].to; int w = G[u][i].weight; inDegree[v]--; earliest[v] = max(earliest[v], earliest[u] + w); if (inDegree[v] == 0) { q.push(v); } } } } // 求每个节点的最晚开始时间 void latestTime(int n) { memset(latest, 0x3f, sizeof(latest)); latest[n] = earliest[n]; for (int i = n - 1; i >= 1; i--) { for (int j = 0; j < G[i].size(); j++) { int v = G[i][j].to; int w = G[i][j].weight; latest[i] = min(latest[i], latest[v] - w); } } } // 求关键路径 void searchPath(int u) { vis[u] = true; for (int i = 0; i < G[u].size(); i++) { int v = G[u][i].to; int w = G[u][i].weight; if (earliest[u] + w == earliest[v] && latest[u] - w == latest[v]) { path[v] = 1; if (!vis[v]) { searchPath(v); } } } } // 主函数 int main() { int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; G[u].push_back(edge(v, w)); inDegree[v]++; } topoSort(n); latestTime(n); searchPath(1); cout << "关键路径为:"; for (int i = 1; i <= n; i++) { if (path[i]) { cout << i << " "; } } cout << endl; return 0; } ``` 输入格式为: ``` 节点个数 边数 起点 终点 权值 起点 终点 权值 ... ``` 输出关键路径

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值