图——关键路径 邻接表
时间: 2025-02-28 11:07:57 浏览: 41
### 图的关键路径算法及其邻接表表示
#### 关键路径算法概述
关键路径算法用于在网络计划技术中找出完成整个工程所需的最短时间。该算法主要应用于有向无环图(DAG),其中顶点代表事件,边则代表活动,每条边上附带权重表示完成相应活动所需的时间。
对于DAG中的每一个节点v来说,有两个重要参数:最早发生时间和最迟发生时间。这两个概念帮助计算各个任务之间的浮动时间,并最终确定哪些任务位于项目的最关键路线上[^1]。
#### 邻接表表示法简介
采用邻接表来表达图是一种节省空间的有效手段,尤其适合稀疏图。具体而言,在C语言里可以通过定义两个数组实现——一个是用来保存各结点信息的一维数组;另一个是由指针构成的链表集合,每个元素对应于某个特定结点所关联的所有其他结点的信息列表。
以下是基于上述描述的一个简单例子:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单个链接的数据结构体
typedef struct EdgeNode {
int adjvex; // 存储弧头的位置编号
float weight; // 边上的权值
struct EdgeNode *next;
}EdgeNode;
// 定义顶点数据结构体
typedef struct VertexNode {
char data; // 顶点信息(这里假设为字符型)
EdgeNode *firstedge;// 指向第一条依附该顶点的边的指针
}VertexNode, AdjList[MAX_VERTEX_NUM];
// 创建一个新的边缘节点并返回其地址
EdgeNode* CreateEdge(int vj,float w){
EdgeNode *e=(EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex=vj;
e->weight=w;
e->next=NULL;
return e;
}
void AddEdge(AdjList G,int vi,int vj,float w){
EdgeNode *p,*q;
p=G[vi].firstedge;
if(!p){ // 如果当前顶点还没有任何连接,则直接创建新的边缘节点作为第一个
G[vi].firstedge=CreateEdge(vj,w);
}else{
while(p->next!=NULL)p=p->next; // 否则遍历到链表末端再添加新节点
q=CreateEdge(vj,w);
p->next=q;
}
}
```
此代码片段展示了如何利用邻接表构建加权有向图,并提供了一个简单的接口`AddEdge()`用于增加一条从vi指向vj具有指定权重w的新边。
阅读全文
相关推荐


















