代码如下:

#include <iostream>
#include <stack>
#include <string>
using namespace std;
const int N = 10010;
using vnodeType = int;typedef struct Node
{int adj;int tw;//弧的时间权值Node *next;
}Node;typedef struct Vnode
{vnodeType v;//存储图中结点的信息int in;Node *first;}Vnode;class AoeGraph
{public:AoeGraph(){memset(adjlist, 0, sizeof(adjlist));memset(ve, 0, sizeof(ve));memset(tpord, 0, sizeof(tpord));memset(vl, 0, sizeof(vl));}void createGraph(){int n, m;cin >> n >> m;vn = n;en = m;for (int i = 0; i < vn; i++){cin >> adjlist[i].v;adjlist->first = nullptr;}for (int i = 0; i < m; i++){int x, y, w;cin >> x >> y >> w;Node *p = new Node;p->adj = y;p->tw = w;p->next = adjlist[x].first;adjlist[x].first = p;}}void findIn(){for (int i = 0; i < vn; i++){adjlist[i].in = 0;}for (int i = 0; i < vn; i++){for (Node *p = adjlist[i].first; p; p = p->next){adjlist[p->adj].in++;}}}bool TopOrder(){stack<int>s;findIn();for (int i = 0; i < vn; i++){if (adjlist[i].in == 0){s.push(i);}}int n = vn;int cnt = 0;while (!s.empty()){int xx = s.top();s.pop();n--;//tpord[cnt++] = adjlist[xx].v;tpord[cnt++] = xx;for (Node *p = adjlist[xx].first; p; p = p->next){int yy = p->adj;adjlist[yy].in--;if (adjlist[yy].in == 0){s.push(yy);}if (ve[xx] + p->tw > ve[yy]){ve[yy] = ve[xx] + p->tw;}}}if (!n) return true;else return false;}bool Criticalpath(){int cnt = vn;if (!TopOrder()) return false;for (int i = 0; i < vn; i++){vl[i] = ve[vn - 1];//初始化顶点事件的最迟发生时间}for (int i = cnt - 1; i >= 0; i--){int xx = tpord[i];for (Node *p = adjlist[xx].first; p; p = p->next){int yy = p->adj;if (vl[yy] - p->tw < vl[xx]){vl[xx] = vl[yy] - p->tw;}}}int e = 0;int l = 0;for (int i = 0; i < vn; i++) coll[i] = false;for (int i = 0; i < vn; i++){for (Node *p = adjlist[i].first; p; p = p->next){int k = p->adj;e = ve[i];l = vl[k] - p->tw;if (e == l) {coll[i] = coll[k] = true;}}}return true;}void dfs(int v,int cnt,int ans){path[cnt++] = v;if (v == vn - 1){cout << "value = " << ans << endl;for (int i = 0; i < cnt; i++){cout << path[i] << " ";}cout << endl;return;}for (Node *p = adjlist[v].first; p; p = p->next){int k = p->adj;if (!vis[k] && coll[k]){vis[k] = true;dfs(k, cnt, ans + p->tw);vis[k] = false;}}}void printPath(){for (int i = 0; i < vn; i++) vis[i] = false;vis[0] = true;dfs(0, 0, 0);}private:Vnode adjlist[N];int vn;int en;int tpord[N];int ve[N];int vl[N];bool coll[N];//标记关键路径的点bool vis[N];//标记是否访问过int path[N];//保存要输出的路径
};int main()
{AoeGraph g;g.createGraph();g.Criticalpath();g.printPath();return 0;
}

测试结果:

C++实现AOE网中的关键路径算法(邻接表存储)相关推荐

  1. C++实现AOE网中的关键路径算法及机动时间计算算法(邻接表存储)

    代码如下: #include <iostream> #include <stack> using namespace std; const int N = 100;typede ...

  2. 基于广度优先遍历算法求采用邻接表存储的无向连通图G中从顶点u到v的最短路径

    问题 假设图G采用邻接表存储,设计一个算法,求不带权无向连通图G中从顶点u->v的最短路径(路径上经过的顶点数最少.采用广度优先遍历来实现. 基本思路 我们首先来看一下BFS的过程: 图片摘自慕 ...

  3. 采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。

    以邻接表存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i!=j). 问题描述:试基于图的深度优先搜索策略编写一程序,判别以邻接表存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i!=j). 输入 ...

  4. 邻接表存储 - 拓扑排序算法

    拓扑排序:用下面的例子介绍------> ---------------------------------------------------------------------------- ...

  5. 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。

    采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径.设计算法,将一个无向图的邻接矩阵转换为邻接表. 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径. 设计算法,将一个无向图的邻 ...

  6. AOE网(求关键路径)(c/c++)

    工程中想要知道完成工程至少需要多少时间以及影响工程进度的关键子工程,通过AOE网来解决.其中边表示活动,顶点表示事件. 如下图:       其中入度为0的点v0称为源点,出度为0的点v5称为汇点.当 ...

  7. #1093 : 最短路径·三:SPFA算法(邻接表)

    #1093 : 最短路径·三:SPFA算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共 ...

  8. 图采用邻接表存储,设计一个算法,判断顶点i和顶点j(i!=j)之间是否有路径

    算法思想:只要以i为起点,进行遍历,只要遍历过程中遇到了j,就证明有路径. 算法代码 int DFSTravel(AGraph *G,int i,int j) {int k;for(k=0;k< ...

  9. C++实现dijkstra单源最短路径算法-邻接表+优先队列

    dijkstra单源最短路径算法不允许边权值为负,适用的图范围可以很大. 代码如下: #include <iostream> #include <queue> #include ...

最新文章

  1. idea设置开发方式
  2. matlab工作区保留或者清除部分变量
  3. WSDM Cup 2020 引用意图识别赛道冠军解决方案(附答辩视频、PPT和代码)
  4. [OpenJudge 3066]随机序列
  5. Go基础学习记录 - 编写Web应用程 - 完善Blog Model
  6. Sqlserver的一些小笔记
  7. (14)机器学习_f1,auc值
  8. 线性代数及matlab实现,线性代数及其MATLAB应用
  9. 安川机器人焊枪切换设定方法_安川机器人工具、用户、安全模式设定方法
  10. java类和对象的生命周期
  11. 你应该掌握的浏览器相关知识
  12. 计算机专业的学生应当如何规划他的专业学习
  13. $.ajax传递数组的两种方式
  14. understand学习
  15. oracle 启动crs进程,由于CRS磁盘dismount造成的CRS进程无法启动问题
  16. 双十一有哪些必入的数码好物?值得入手的数码好物推荐
  17. android 程序优化
  18. 神经网络机器翻译简单模型参考实现
  19. KALI2021安装中文输入法
  20. gprinter佳博打印机androidSDK

热门文章

  1. 【Envi风暴】基于ENVI平台提取ASTER DEM完整操作步骤(附案例数据)
  2. linux之自己总结学习linux的资源推荐
  3. Android之ANR异常及解决方法
  4. c语言在win8系统不兼容,Win8系统中存在不兼容软件如何解决?
  5. 3%7python_Centos7 Python2 升级到Python3
  6. python3文件的编码类型是什么_Python3编码类型有哪些?怎么转换?
  7. 服务器连接不稳定fifa,fifa服务器链接异常
  8. 据说很多女生都想知道男生是如何上厕所的?
  9. 抛物面天线的工作原理是什么?
  10. 这几张图告诉你化学到底有多神奇!看完瞬间觉得智商都提高了!