【数据结构】关键路径

news/2024/7/5 4:02:37

在有向图中,如果用顶点表示事件,弧表示活动,弧上的权值表示活动持续的时间,这样的活动称为边表示活动的网,简称AOE网(Activity On Edge)。通常可以用AOE网来估算工程的完成时间,他不仅表达了工程中各事件的先后关系,更可说明整个工程至少需要多少时间完成以及哪些活动是影响工程进度的关键活动

在AOE网中:

源点:一个入度为零的事件

汇点:一个出度为零的事件

由于一个AOE网中某些活动可以并行地进行,所以完成的工程的最短时间是从源点到汇点最长路径的长度。相应地,从源点到汇点的最长路径称为AOE网的关键路径

AOE网的创建以及求出各事件的最早发生时间和各事件的最晚允许开始时间

e(i):活动 a_{i} 的最早开始时间

l(i):活动最迟开始时间,这是在不推迟整个工程完成的前提下,活动 a_{i} 最迟必须开始的时间。

若某一活动 a_{i} 最早开始时间 e(i) 等于这个活动的最迟开始时间 l(i),则说明 a_{i} 是一个关键活动。

文件直接读取数据!!!!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>const int M = 20;
int ve[M];//事件最早发生时间向量
int seq[M];//拓扑排序列向量
int vl[M];//事件最晚允许发生时间向量
int e[M];//活动的最早开始时间
int l[M];//活动最迟开始时间typedef struct node//边结点类型定义
{int adjvex;int len;struct node *next;
}EdgeNode;typedef struct de //带顶点入度的头节点定义
{EdgeNode *FirstEdge;char vertex;int id;
}vertexnode;typedef struct 
{vertexnode adjlist[M];int n,e;
}AoeGraph;void creat (AoeGraph *g)
{int i,j,k,len;EdgeNode *s;FILE *f;f=fopen("test.txt","r");fscanf(f,"%d%d",&g->n,&g->e);for(i=0;i<g->n;i++){fscanf(f,"%1s %d",&g->adjlist[i].vertex,&g->adjlist[i].id);g->adjlist[i].FirstEdge=NULL;}for(k=0;k<g->e;k++){fscanf(f,"%d%d%d",&i,&j,&len);s=(EdgeNode*)malloc(sizeof(EdgeNode));s->len=len;s->adjvex=j;s->next=g->adjlist[i].FirstEdge;g->adjlist[i].FirstEdge=s;}return ;
}void print(AoeGraph g)
{EdgeNode *p;int i;printf("一共有%d个结点,%d条边\n",g.n,g.e);for(i=0;i<g.n;i++){printf("入度:%d  V%c ",g.adjlist[i].id,g.adjlist[i].vertex);p=g.adjlist[i].FirstEdge;while(p){printf("(w=%d) %d",p->len,p->adjvex);if(p->next)printf(" -> ");p=p->next;}printf("\n");}return ;
}//求每个事件最早发生的时间
int EarlistTime(AoeGraph gout)//返回输出的顶点个数
{int count=0,i,j,v,flag[M];int queue[M];int front = 0,rear = 0;EdgeNode *p;memset(ve,0,sizeof(ve));//初始化每个顶点最早开始时间是ve[i]=0;memset(flag,0,sizeof(flag));//访问标记初始化for(i=0;i< gout.n;i++){if(gout.adjlist[i].id==0 && flag[i]==0){queue[rear++]=i;flag[i]=1;}}while(front < rear)//队列不为空{v=queue[front++];//队首元出队printf("%c ",gout.adjlist[v].vertex);seq[count++]=v;//记录拓扑排序当前元素,计数器加一p=gout.adjlist[v].FirstEdge;while(p){j=p->adjvex;if(--gout.adjlist[j].id==0 && flag[j]==0)//入度为0则将进队{queue[rear++]=j;flag[j]=1;}if(p->len+ve[v]>ve[j])ve[j]=ve[v]+p->len;p=p->next;}}printf("\n各个事件的最早发生时间:\n");for(i=0;i<gout.n;i++){printf("ve[%d]=%d\n",i,ve[i]);}return count;
}//各事件的最晚允许开始时间
void LateTime(AoeGraph gin)
{int k=gin.n-1,i,j,v;EdgeNode *p;for(i=0;i<gin.n;i++)vl[i]=ve[seq[gin.n-1]];while(k>-1)//按照拓扑排序求各事件最晚时间{v=seq[k];p=gin.adjlist[v].FirstEdge;while(p){j=p->adjvex;if(vl[j]-p->len < vl[v])vl[v]=vl[j]-p->len;p=p->next;}k--;}printf("各个事件允许发生的最晚时间:\n");for(i=0;i<gin.n;i++){printf("vl[%d]=%d\n",i,vl[i]);}return ;
}//求e[k] 和 l[k]
void activity(AoeGraph g)
{int i,j,k,q;EdgeNode *p; memset(e,0,sizeof(e));i=0;q=0;printf("--------------------------------------------------------------------------\n");printf("起点 | 终点 | 活动最早开始时间 | 活动最晚开始时间 | 差值 | 是否为关键路径|\n");for(j=0;j<g.n;j++){p=g.adjlist[j].FirstEdge;while(p){k=p->adjvex;e[i]=ve[j];l[i]=vl[k]-p->len;printf("%c    |%5d |%10d        |%10d        |%5d |",g.adjlist[j].vertex,k,e[i],l[i],l[i]-e[i]);if(e[i]==l[i]){printf("    √\n");}else{printf("    \n");}printf("--------------------------------------------------------------------------\n");p=p->next;}}
}int main ()
{AoeGraph g;creat(&g);print(g);printf("\n输出的顶点个数:%d\n\n",EarlistTime(g));LateTime(g);activity(g);return 0;
}

          


http://lihuaxi.xjx100.cn/news/251433.html

相关文章

VC:其他控件(CProgressCtrl、CScrollBar、CDateTimeCtrl、CMonthCalCtrl)

1、进度条 m_progressCtrl.SetRange(0,100); for(int i0;i<100;i) { m_progressCtrl.SetPos(i); Sleep(100); } AfxMessageBox("进度条到达终点"); 2、滑块控件&#xff1a;添加WM_VSCROLL消息。 void COtherCtrlDlg::OnHScroll(UINT nSBCode, UINT nPos, CScroll…

linux孤立cpu,Linux 抛弃旧款 CPU,一下子少 50 万行代码

IT 之家4 月 3 日消息 Linux 内核维护者已经决定在即将发布的新版本中抛弃对旧款 CPU 架构的支持&#xff0c;因此 Linux 4.17 内核将减少大约 500000 行代码&#xff0c;根据 Linux 统计器&#xff0c;目前它包含大约 2030 万行代码。IT 之家报道&#xff0c;将被弃用的体系架…

SpringBoot 中 JPA 的使用

前言 第一次使用 Spring JPA 的时候&#xff0c;感觉这东西简直就是神器&#xff0c;几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。下面我们就用一个例子来讲述以下 JPA 使用的基本操作。 新建项目&#xff0c;增加依赖 在 Intellij IDEA 里面新建一个…

【组队学习】【32期】推荐系统-新闻推荐系统实践

推荐系统-新闻推荐系统实践 航路开辟者&#xff1a;罗如意领航员&#xff1a;肖桐航海士&#xff1a;汪志鸿、吴忠强、赖敏材、王辰玥、毛伟、宋禹成、陈雨龙、管柯琴 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/fun-rec内容属性&#xff1a;公测课程…

input core input.c (1)

drivers/input/input.c 就是所谓的input的核心程序。 分析这个文件&#xff0c;先从input_init开始。 1: static int __init input_init(void) 2: { 3: err class_register(&input_class); 4: err input_proc_init(); 5: err register_chrdev(INPUT_MAJOR, "i…

GZip压缩与解压缩

GZIP的压缩与解压缩代码&#xff1a; public static class CompressionHelper{/// <summary> /// Compress the byte[] /// </summary> /// <param name"input"></param> /// <returns></returns> public static byte[] Compres…

linux shell显示下载进度,shell脚本测试下载速度

在linux下用shell来测试下载速度&#xff0c;很实用的shell代码。代码&#xff1a;复制代码 代码示例:#!/bin/bash#date:20140210# edit: www.jquerycn.cn#used for test server download speedr_host"188.18.28.19"r_dir"/home/test0208/tmp"r_file"…

TSQL语句中的Like用法

SQL Server&#xff1a;SQL Like 的特殊用法 %&#xff1a;匹配零个及多个任意字符&#xff1b; _&#xff1a;与任意单字符匹配&#xff1b; []&#xff1a;匹配一个范围&#xff1b; [^]&#xff1a;排除一个范围 SymbolMeaninglike 5[%]5%like [_]n_nlike [a-cdf]a, b, c, d…