数据结构--6.2关键路径

这篇具有很好参考价值的文章主要介绍了数据结构--6.2关键路径。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AOE网:

        在一个表示工程的带权有向图中,用顶点表示事件,用有向边上的权值表示活动表示持续时间,这种有向图的边表示活动的网,我们称为AOE网(Activity On Edge Network)。

我们把AOE网中没有入边的顶点称为始点或源点,没有出边的顶点称为终点或汇点。

数据结构--6.2关键路径,数据结构 

——etv(Earliest Time Of Vertex)

        事件最早发生时间,就是顶点的最早发生时间。 

——ltv (Latest Time Of Vertex)

        事件最晚发生时间,就是每个顶点对应的事件最晚需要开始的时间,如果超出此时间将会延误整个工期。 

——ete (Earliest Time Of Edge)

        活动的最早开工时间,就是弧的最早发生时间。

——lte (Latest Time Of Edge)

        活动的最晚发生时间,就是不推迟工期的最晚开工时间。文章来源地址https://www.toymoban.com/news/detail-701078.html

#define <stdio.h>
//边表结点声明 
typedef struct EdgeNode
{
	int adjvex;
	struct EdgeNode * next; 
}EdgeNode;

//顶点表结点声明 
typedef struct VertexNode
{
	int in;				//顶点入度 
	int data;
	EdgeNode * firstedge;
}VertexNode,AdjList[MAXVEX];

typedef struct
{
	AdjList adjList;
	int numVertexes,numEdges;
}graphAdjList , *GraphAdjList;

int *etv,*ltv;
int *stack2;			//用于存储拓扑序列的栈 
int top2;				//用于stack2的栈顶指针 

//拓扑排序算法
//若GL无回路,则输出拓扑排序序列并返回OK,否则返回ERRor 
Status TopologicalSort(GraphAdjList GL)
{
	EdgeNode *e;
	int i,k,gettop;
	int top = 0;		//用于栈指针下标索引 
	int count = 0;		//用于统计输出顶点的个数 
	int *stack;			//用于存储入度为0的顶点
	
	stack = (int *)malloc(GL->numVertexes * sizeof(int));
	
	for(i=0;i < GL->numVertexes;i++)
	{
		if(0 == GL->adjList[i].in)
		{
			stack[++top] = i; //将度为0的顶点下标入栈 
		}
	} 
	
	//初始化etv都为0
	top2 = 0;
	etv = (int *)malloc(GL->numVertexes * sizeof(int));
	for(i=0;i < GL->numVertexes * sizeof(int))
	{
		etv[i] = 0;
	} 
	stack2 = (int *)malloc(GL->numVertexes * sizeof(int));
	while(0 != top)
	{
		gettop = stack[top--];			//出栈 
		stack2[++top2] = gettop;		//保存拓扑序列顺序 
		count++;
		
		for(e = GL->adjList[gettop].firstedge;e;e=e->next)
		{
			k = e->adjvex;
			//将k号顶点邻接点的入度-1,因为他的前驱已经消除
			//接着判断-1后入度是否为0,如果为0则也入栈 
			if(!(--GL->adjList[k].in))
			{
				stack[++top] = k;
			}
			
			if((etv[gettop]+e->weight) > etv[k])
			{
				etv[k] = etv[gettop] + e->weight;
			} 
		}
	} 
	if(count <GL->numVertexes )  //如果count小于顶点数,说明存在环
	{
		return ERROR;
	 } 
	else
	{
		return OK;
	}
}

//求关键路径,GL为有向图,输出GL的各项关键活动
void CriticalPath(GraphAdjList GL)
{
	EdgeNode *e;
	int i,gettop,k,j;
	int ete,lte;
	
	TopologicalSort(GL);
	
	ltv = (int *)malloc(GL->numVertexes * sizeof(int));
	for(i=0;i<GL->numVertexes;i++)
	{
		ltv[i] = etv[GL->numVertexes-1];
	}
	
	//从汇点倒过来逐个计算ltv 
	while(0 !=top2)
	{
		gettop = stack2[top2--];	//第一个出栈是汇点 
		for(e = GL->adjList[gettop].firstedge; e ;e=e->next)
		{
			k = e->adjvex;
			if((ltv[k]- e->weight) < ltv[gettop])
			{
				ltv[gettop] = ltv[k] - e->weight;
			}
		}
	}
	
	//通过etv和ltv求ete和lte 
	for(j=0;j<GL->numVertexes;j++)
	{
		for(e = GL->adjList[j].firstedge; e; e = e->next)
		{
			k  = e->adjvex;
			ete = etv[j];
			lte = ltv[k] - e->weight;
			
			if(ete == lte)
			{
				printf("<v%d,v%d> length: %d , ",GL->adjList[j].data,GL->adjList[k].data,e->weight);
			}
		}
	}
 } 

到了这里,关于数据结构--6.2关键路径的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构第12周 :( 有向无环图的拓扑排序 + 拓扑排序和关键路径 + 确定比赛名次 + 割点 )

    【问题描述】 由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义分别如下:若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。设R是集合X上的偏序,如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序

    2024年02月08日
    浏览(41)
  • 【数据结构】图的应用:最小生成树;最短路径;有向无环图描述表达式;拓扑排序;逆拓扑排序;关键路径

    目录 1、最小生成树 1.1 概念  1.2 普利姆算法(Prim) 1.3 克鲁斯卡尔算法(Kruskal)  2、最短路径 2.1 迪杰斯特拉算法(Dijkstra) 2.2 弗洛伊德算法(Floyd)  2.3 BFS算法,Dijkstra算法,Floyd算法的对比 3、有向无环图描述表达式 3.1 有向无环图定义及特点 3.2 描述表达式 4、拓扑排序

    2024年02月07日
    浏览(50)
  • 数据结构图 算法6.1-6.2创建无向网 算法6.4-6.6DFS

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Time of completion:2022.12.6 Last edited: 2022.12.6 任务描述 本关任务:编写一个能输出无向图邻接矩阵的小程序。 相关知识 为了完成本关任务,你需要掌握:1.创建邻接矩阵 编程要求 根据提示,在右侧编辑器

    2024年02月03日
    浏览(51)
  • 【数据结构】树形结构所有路径复原为链表

    目录 1. 树形结构可视化 2. 树形结构转为链表 此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构,它表示元素之间层次关系。在树形结构中,每个节点可能拥有一个或多个子节点,形成了一个分层的结构。为了还原树形结构的路径,我们需要找到从根节点

    2024年02月06日
    浏览(38)
  • 从零起步:学习数据结构的完整路径

    🎉欢迎来到数据结构学习专栏~从零起步:学习数据结构的完整路径 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java学习路线 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 🍹文章作者技术和水平有限,如果文中出

    2024年02月11日
    浏览(50)
  • 【算法与数据结构】112、LeetCode路径总和

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题通过计算根节点到叶子节点路径上节点的值之和,然后再对比目标值。利用文章【算法和数据结构】257、LeetCode二叉树的所有路径中的递归算法。 这里要注意,默认路径之和是

    2024年02月11日
    浏览(53)
  • 【算法与数据结构】62、LeetCode不同路径

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :机器人只能向下或者向右移动,那么到达(i,j)位置的路径和(i-1,j)以及(i,j-1)有关。那么我们就得到的动态规划的表达式 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][

    2024年01月18日
    浏览(67)
  • 数据结构与算法的安全与隐私:保护数据和信息的关键

    数据结构和算法在计算机科学中起着至关重要的作用。它们为我们提供了一种高效地处理和存储数据的方法,使得我们能够更好地理解和解决复杂的问题。然而,随着数据的增长和技术的进步,保护数据和信息的安全和隐私变得越来越重要。因此,本文将探讨数据结构和算法

    2024年02月19日
    浏览(46)
  • 【算法与数据结构】63、LeetCode不同路径 II

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :参考【算法与数据结构】62、LeetCode不同路径的题目,可以发现本题仅仅是多了障碍物。我们还是用动态规划来做。有障碍物的地方无法到达,因此路径数量为0,只需要将障碍物位

    2024年02月02日
    浏览(57)
  • 2023-07-25 monetdb-relation-关键数据结构-记录

    monetdb-relation-关键数据结构-记录

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包