数据结构---关键路径

数据结构—关键路径

原理:参考趣学数据结构

代码:

#include<stdio.h>
#include<stdlib.h>
#include "stack.h"
#define typeNode int //每个头结点的标识数据类型
#define N 100 //最大结点数
int degree[N];//结点入度数,通过逆邻接表来计算
int result[N];//拓扑序列
int ve[N];//结点(事件)的最早发生时间
int vl[N]; //结点(事件)的最晚发生时间
int ZNodeMatrix[N][N];//邻接矩阵,一个结点到另一个结点的权重
typedef struct dNode {//每个头结点后紧跟的单位结点int data;struct dNode * next;
}dNode;
typedef struct mNode {//邻接表中每一行的头结点typeNode data;dNode * first;//指向第一个有效的后继结点
}mNode;
typedef struct {mNode vNode[N];//所有头结点int vNum, eNum;//图中顶点的数量和边数量
}zNode;
void init(zNode &ZNode) {printf("规定顶点从0开始取\n");scanf_s("%d%d", &ZNode.vNum, &ZNode.eNum);//输入有向图的顶点数和边数for (int i = 0; i < ZNode.vNum; i++) {//规定顶点从0开始取scanf_s("%d", &ZNode.vNode[i].data);ZNode.vNode[i].first = NULL;}for (int i = 0; i < ZNode.eNum; i++) {int u, v,weight;scanf_s("%d%d%d", &u, &v,&weight);//u顶点到v顶点有边dNode* p = new dNode();ZNodeMatrix[u][v] = weight;p->data = v;p->next = ZNode.vNode[u].first;//只有指针域,指向地址ZNode.vNode[u].first= p;}
}
void print(zNode ZNode) {printf("遍历链表:\n");for (int i = 0; i < ZNode.vNum; i++) {dNode* temp = ZNode.vNode[i].first;printf("%d ->", ZNode.vNode[i].data);while(temp){printf("%d ->",temp->data);temp = temp->next;}printf("NULL\n");}
}
void calculate(zNode ZNodeReverse) {//返回有向图每个顶点的入度//每个顶点的入度for (int i = 0; i < ZNodeReverse.vNum; i++) {int tempLength = 0;dNode* p = new dNode();p = ZNodeReverse.vNode[i].first;while (p) {tempLength ++;p = p->next;}degree[i] = tempLength;}
}
bool tuoPuSort(zNode ZNode,int result[],stack &Stack) {//拓扑排序只是找到学习的先后依赖顺序,并不是排序int count = 0;//计数for (int i = 0; i < ZNode.vNum; i++) {if (!degree[i]) {//对入度为0的点入栈push(Stack, i);}}while (!empty(Stack)) {dNode* p ;int tempV = getTop(Stack);result[count] = tempV;count++;int e=0;pop(Stack, e);p = ZNode.vNode[tempV].first;//取以tempV顶点为入度点while (p) {//和tempV相连的邻接边的入度减1int v = p->data;degree[v]--;if (!degree[v]) {push(Stack, v);}p = p->next;}}if (count < ZNode.vNum) {return false;}else {return true;}
}
void keyPath(zNode ZNode) {//计算关键路径//初始化int k;for (int i = 0; i < ZNode.vNum; i++) {ve[i] = 0;}//计算结点(事件)的最早发生时间for (int i = 0; i < ZNode.vNum; i++) {k = result[i];//按照拓扑排序的顺序计算事件的最早发生时间dNode* p = ZNode.vNode[k].first;while (p != NULL) {int j = p->data;if (ve[k] + ZNodeMatrix[k][j] > ve[j]) {//最大值ve[j] = ve[k] + ZNodeMatrix[k][j];}p = p->next;}}//初始化事件最晚发生的时间for (int i = 0; i < ZNode.vNum; i++) {vl[i] = ve[result[ZNode.vNum - 1]];}//计算结点(事件)的最迟发生时间,从后往前计算for (int i = ZNode.vNum-1; i >=0 ; i--) {k = result[i];//按照拓扑排序的顺序计算事件的最迟发生时间dNode* p = ZNode.vNode[k].first;while (p != NULL) {int j = p->data;if (vl[k]>vl[j]- ZNodeMatrix[k][j]) {//最小值vl[k] = vl[j] - ZNodeMatrix[k][j];}p = p->next;}}int sum = 0;printf("关键路径如下:\n");//计算边(活动)的最早和迟发生时间for (int i = 0; i < ZNode.vNum; i++) {k = result[i];//按照拓扑排序的顺序计算边(活动)的最早和迟发生时间dNode* p = ZNode.vNode[k].first;while (p != NULL) {int j = p->data;int e = ve[k];int l = vl[j] - ZNodeMatrix[k][j];if (e == l) {sum+= ZNodeMatrix[k][j];printf("(%d,%d) ", k, j);}p = p->next;}}printf("关键路径长度为%d:\n",sum);
}
int main() {zNode ZNode,ZNodeReverse;printf("邻接表的构造:\n");init(ZNode);print(ZNode);printf("逆邻接表的构造:\n");init(ZNodeReverse);print(ZNodeReverse);calculate(ZNodeReverse);stack Stack;init(Stack);printf("拓扑序列如下: ");if (tuoPuSort(ZNode, result,Stack)) {printf("\n可以构成拓扑序列!");};for (int i = 0; i < ZNode.vNum; i++) {printf("%d ", result[i]);}printf("\n");keyPath(ZNode);//关键路径计算system("pause");return 0;
}

测试截图:

请添加图片描述

时间复杂度O(n+e),空间复杂度O(n+e)

如果存在什么问题,欢迎批评指正!谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SkyWalking学习笔记(Window环境 本地环境)

基于 Windows 环境使用 SkyAPM-dotnet 来介绍一下 SkyWalking&#xff0c; SkyAPM-dotnet 是 SkyWalking 的 .NET Agent环境要求JDK8Elasticsearch8080,9200,10800,11800,12800 端口不被占用Elasticsearch安装Elasticsearch下载安装 参考官方教程.Elasticsearch下载安装官方教程…

word List16

word List16 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

python二分法求方程的根_Python查找函数f(x)=0根的解决方法

线性代数分享方程f(x)0的根 函数F(x)0的重根与F(x)0的根有什么关系&#xff1f;有些人一旦错过了&#xff0c;就是一辈子不再主动联系&#xff0c;不愿打扰你的生活&#xff0c;连偶尔的寒暄都没有&#xff0c;成长就是这样的&#xff0c;不断的告别&#xff0c;不断的遇见。 请…

word List 17

word List 17 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

pb 如何导出csv_如何计算指数温度?

指数温度的高低与价格高低没有必然的联系&#xff0c;指数温度的高低反映的是在历史中低于指数当前估值出现的概率。温度越低说明在历史上低于当前估值的概率越小&#xff0c;指数的价值越被低估&#xff0c;上涨的概率越大&#xff1b;温度越高说明在历史上低于当前估值的概率…

算法问题---两艘船是否有最大承载量

算法问题—两艘船是否有最大承载量 代码&#xff1a; 栈代码&#xff1a; #pragma once #include<stdio.h> #define maxSize 100 typedef struct stack {int * base;int * top; }stack; bool init(stack & Stack) {//栈的初始化Stack.base new int[maxSize];if (…

python标准库time_Python 标准库之时间篇

写在之前 大家好&#xff0c;这是首发在我公众号「Python空间」的第 69 篇文章&#xff0c;欢迎关注&#xff0c;期待和你的交流。 在昨天的文章&#xff08;Python 标准库之日期&#xff09;中我们学习了 Python 标准库中「日期 & 时间」中的「日期」&#xff0c;本来想昨…

《ASP.NET Core 微服务实战》-- 读书笔记(第12章)

第 12 章 设计汇总微服务开发并不是要学习 C#、Java 或者 Go 编程--而是要学习如何开发应用以适应并充分利用弹性伸缩环境的优势&#xff0c;它们对托管环境没有偏好&#xff0c;并能瞬间启停换句话说&#xff0c;我们要学习如何开发云原生应用识别并解决反模式我们既然已经学习…

[蓝桥杯2017初赛]纸牌三角形-枚举permutation+数论

题目描述 A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形&#xff08;A按1计算&#xff09;。要求每个边的和相等。 下图就是一种排法这样的排法可能会有很多。 如果考虑旋转、镜像后相同的算同一种&#xff0c;一共有多少种不同的排法呢&#xff1f; 输出 输出一个整数表示答…

算法----最大承载量下的最大价值问题

算法----最大承载量下的最大价值问题 代码&#xff1a; 栈代码&#xff1a;&#xff08;存储哪些是需要的价值物&#xff09; #pragma once #include<stdio.h> #define maxSize 100 typedef struct stack {int * base;int * top; }stack; bool init(stack & Stack…

oracle多条件分组统计_多条件统计,就必须用Ifs系列函数,绝对的高能!

数据统计&#xff0c;我们并不陌生&#xff0c;但是在实际的工作或应用中&#xff0c;数据统计都是附加条件的&#xff0c;而且大多情况下是“多条件”的&#xff0c;此时&#xff0c;我们必须掌握“Ifs”系列函数。一、多条件判断&#xff1a;Ifs函数。功能&#xff1a;判断指…

AcWing 895. 最长上升子序列

给定一个长度为N的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1≤N≤1000&#xff0c; −10^9≤数列中的数≤ 10…

word List18

word List18 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

AcWing 1015. 摘花生

Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所有的花生。…

干货,不小心执行了rm -f,除了跑路,如何恢复?

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

数据结构----二叉树叶子结点到根节点的高度计算

数据结构----二叉树叶子结点到根节点的高度计算 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bstTree {int data;struct bstTree* lchild, *rchild; }bstTree; void createBSTTree(bstTree* & T, int data) {//创建二叉排序树bst…

nginx 带宽_前端工程师不可不知的Nginx知识

历史背景互联网的全球化导致了互联网的数据量快速增长&#xff0c;加上在本世纪初摩尔定律在单核 CPU 上的失效&#xff0c;CPU 朝着多核方向发展&#xff0c;而 Apache 显然并没有做好多核架构的准备&#xff0c;它的一个进程同一时间只能处理一个连接&#xff0c;处理完一个请…

网格路径最小数字和

给定一个包含非负整数的 m x n 网格&#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 数据范围&#xff1a; n < 100,m < 100; 输入&#xff1a; 3 3 1 3 1 1 5 1 4 2 1 输出&a…

word List 19

word List 19 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

矩形法_字体设计 | 新手必学,超简单的矩形造字法!!

点击蓝字关注&#xff0c;创智助你长姿势作为一个刚刚踏入设计界的“萌新”来说&#xff0c;字体设计可能是除了版式设计之外最简单的功课了&#xff0c;那么今天教学内容就是最简单的字体设计&#xff1a;矩形造字法。矩形造字法是以软件中的“矩形工具”为基础&#xff0c;以…