关键路径的算法实现(C++)
对于关键路径算法实现了一下,下面附上代码 相比于原博文 ,做出了一些调整.
添加链接描述
#include <stdio.h>
#include <stdlib.h>
#define MaxVerNum 20 int visited[MaxVerNum];//访问标志 typedef char VertexType; typedef struct ArcNode
{ int adjvex; //该弧指向的顶点位置 struct ArcNode * nextarc; //指向下一个表结点 int info; //权值信息
}ArcNode; //边结点类型 typedef struct VNode
{ VertexType data; //顶点的数据域int indegree; //该顶点的度ArcNode * firstarc; //该顶点的的第一条邻接边
}VNode, Adjlist[MaxVerNum]; typedef struct
{ Adjlist vertices; //邻接表 int vernum, arcnum; //顶点数和弧数
}ALGraph; //查找符合的数据在数组中的下标
//返回该顶点在顶点数组中的位置
int LocateVer(ALGraph G, char u)
{ int i; for(i = 0; i < G.vernum; i++) { //就是通过比较数据域是否相等if(u == G.vertices[i].data) return i; } if(i == G.vernum) { printf("Error u!\n"); exit(1); } return 0;
} //常见图的邻接矩阵
void CreateALGraph(ALGraph &G)
{ int i, j, k, w; char v1, v2; ArcNode * p; printf("输入顶点数和弧数: "); scanf("%d %d", &G.vernum, &G.arcnum); //vernum是值顶点数 printf("请输入顶点!\n"); for(i = 0; i < G.vernum; i++) { //挨个输入顶点的信息 输入这个顶点的入度 数据信息 以及第一条边的指针printf("请输入第 %d 个顶点: \n", i); fflush(stdin); scanf("%c", &G.vertices[i].data); //初始化的时候 将其的入度设置位0,第一条指针设置为空 G.vertices[i].firstarc = NULL; G.vertices[i].indegree = 0; } for(k = 0; k < G.arcnum; k++) { printf("请输入弧的顶点和相应权值(v1, v2, w): \n"); //清空输入缓冲区 fflush(stdin); //输入这条弧对对应顶点 以及这条弧对应的权值scanf("%c %c %d", &v1, &v2, &w); //返回这两个顶点在顶点数组中的位置i = LocateVer(G, v1); j = LocateVer(G, v2); //给邻接表指针分配空间p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = j; //赋值给p->adjvex指向的顶点域p->info = w; //边表结点的权值//这里采用的是头插法 将边插入的边表中去p->nextarc = G.vertices[i].firstarc;//它的nextarc指针域指向i结点的firstarc指针域 G.vertices[i].firstarc = p;//将点i的第一条指针指向 G.vertices[j].indegree++; //vi->vj, vj入度加1 } return;
} //求图的关键路径函数
void CriticalPath(ALGraph G)
{ int i, k, e, l; int * Ve, * Vl; ArcNode * p; //***************************************** //以下是求时间最早发生时间 //***************************************** Ve = new int [G.vernum]; //最早发生时间Vl = new int [G.vernum]; //最迟发生时间for(i = 0; i < G.vernum; i++) //前推 Ve[i] = 0; //先将最早开始时间全部设置为0for(i = 0; i < G.vernum; i++) { ArcNode * p = G.vertices[i].firstarc; while(p != NULL) { k = p->adjvex; //找到最大的路径的权值赋值给Ve[K]if(Ve[i] + p->info > Ve[k]) Ve[k] = Ve[i]+p->info; p = p->nextarc; } } //***************************************** //以下是求最迟发生时间 //***************************************** for(i = 0; i < G.vernum; i++) Vl[i] = Ve[G.vernum-1];//先将数组初始化位最长路径 就是上面算出来的总路径 for(i = G.vernum-2; i >= 0; i--) //后推 { //使用从后往前移动的方式 这里i=G.vernum-2开始 是因为G.vernum这个位置位不需要再考虑了 它就是最大值p = G.vertices[i].firstarc; while(p != NULL) { k = p->adjvex; //此时通过比较把较小的值赋值给vl[i] 最为最迟开始时间if(Vl[k] - p->info < Vl[i]) Vl[i] = Vl[k] - p->info; p = p->nextarc; //遍历找到最小的} } //****************************************** for(i = 0; i < G.vernum; i++) { p = G.vertices[i].firstarc; while(p != NULL) { //k = p->adjvex; e = Ve[i]; //最早开始时间为时间vi的最早发生时间 l = Vl[k] - p->info; //最迟开始时间 这里用到的减法 表示的是活动的最迟开始时间//此活动再晚也需要在头顶点是事件发生之前完成 //如果最早时间等于最晚时间 则证明这是关键路径char tag = (e == l) ? '*' : ' '; //关键活动 printf("(%c, %c), e = %2d, l = %2d, %c\n", G.vertices[i].data, G.vertices[k].data, e, l, tag); p = p->nextarc; } } delete [] Ve; delete [] Vl;
} int main()
{ ALGraph G; printf("以下是查找图的关键路径的程序。\n"); CreateALGraph(G); CriticalPath(G); return 0;
}
关键路径的算法实现(C++)相关推荐
- 关键路径--经典算法
探寻 AOE网 用顶点表示事件,弧表示活动,弧上的权值表示活动持续的时间的有向图叫AOE(Activity On Edge Network)网.在建筑学中也称为关键路线.AOE网常用于估算工程完成时间 ...
- 第5-6课:关键路径算法
作为一个项目经理或工程总监,他最关心的两个问题就是工程是否能顺理进行和整个工程的最短完成时间.第5-2课讲了拓扑排序算法,对应了第一个问题的解决方案,这一课将介绍关键路径算法,就是为了解决第二个问题, ...
- DAG 图关键路径算法
关键路径 如果DAG图拓扑有序,那么此图可以转换成线性的先后关系,而不需要回退去访问数据.如果项目安排的事件拓扑有序,那么此项目中的各个事件的依存关系不可以解耦,不会形成连环套而致使项目无法开展.项目 ...
- C语言数据结构与算法---拓扑排序、关键路径
文章目录 一. 有向无环图 二. 拓扑排序 1. 分析 2. 拓扑排序的定义及方法 3. 拓扑排序的重要应用 4. 拓扑排序的算法实现 三. 关键路径 1.分析 2. 什么是关键路径 3. 关键路径的 ...
- 【数据结构】什么的图的关键路径?关键路径相关概念?关键路径算法实现?
目录 一.什么是关键路径? 1.现实问题 二.关键路径相关概念? 三.关键路径算法实现? 1.算法分析 2.算法步骤 3.算法实现 一.什么是关键路径? 关键路径:若有向图中,各顶点表示事件,各有向边 ...
- 数据结构与算法22-图的关键路径
关键路径 拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题.比如造一辆汽车,我们需要先造各种各样零件.部件,最终再组装成车,假如,造一个轮子需要0.5天时 ...
- 【数据结构-图】4.拓扑排序和关键路径(注解+原理)
一.拓扑排序 1.1 基本知识 有向无环图:一个有向图中不存在环,简称DAG图 AOV网:用DAG图表示一个工程,其顶点表示活动,用有向边 <Vi,Vj><V_i, V_j>& ...
- 求有向图的简单路径_2020福建农信社招聘-关键路径
2020福建农信社公告暂未发布,预计于2020年1月发布公告,历年福建农信社笔试以纸考形式进行,同时笔试内容包含经济.金融.计算机.法律.财会.公基.三农.农信文化.普惠金融.市场营销.时政等部分,相 ...
- AOE网与关键路径简介
前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题.如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程, ...
最新文章
- Nodejs开发微信公众号中控服务
- linux中ctrl+z 、ctrl+c、 ctrl+d区别
- Win10启动盘制作工具
- oracle 事务测试
- 两数、三数、四数之和相关题目(Leetcode题解-Python语言)
- js,jq.事件代理(事件委托)复习。
- Windows 手动触发 BSOD
- 检测React组件外部的点击
- 多普达D700手机利用USB电缆与电脑连接上网方法
- 达梦数据库(DM7) 常用运维语句
- 转:驳Moxie关于Web3中“去中心化”、“服务器”和“密码学”的观点
- 项目经理的五个关键成功因素
- 公司招了个漂亮女程序员是种什么样的体验?
- 将爬取的实习僧网站数据传入HDFS
- 根号 巴比伦_建立巴比伦卫生设计系统
- 基于Python的微信朋友圈数据可视化分析之个性签名
- Windows 11操作系统 ndis.sys 驱动无限蓝屏问题修复
- 一,SpringMVC入门
- Kafka入门教程(一)
- 【计算】空气质量综合指数+空气质量指数