关键路径和拓扑排序

本文介绍了关键路径和拓扑排序的概念。关键路径是在所有路径中耗时最长的路径,而拓扑排序是对图中节点的一种排序方式,确保没有从后往前的连接。文章通过代码示例展示了如何进行拓扑排序,并利用拓扑排序来找出关键路径。
摘要由CSDN通过智能技术生成


简介

  • 几个问题:
  1. 关键路径和拓扑排序求什么?
    求关键路径。拓扑排序是求关键路径中的一环。

  2. 关键路径是什么?
    举例来说,比如在造车过程中有如下的活动,那么哪条路径是关键路径呢?
    就是在所有路径中耗时最长的那条:开始——发动机完成——集中——组装完成,这条路径。
    在这里插入图片描述

  3. 如何判断是关键路径?
    ete == lte的活动为关键活动,其形成的路径为关键路径。
    在这里插入图片描述


提示:下附代码,亲测可用

1. 拓扑排序

拓扑排序就是对所有节点进行排序,保证节点的连接顺序都是从前往后的,没有从后往前的。

代码如下:

#include "iostream"
using namespace std;
#define MAXVEX 20
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;

void CreateGraph(GraphAdjList GL, int vnum, int anum)
{
   
    GL->numVertexes = vnum;
    GL->numEdges = anum;
    GL->adjList[1].in = 0;
    GL->adjList[1].data = 1;
    EdgeNode* tmp_node_1 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_1->adjvex = 2;
    tmp_node_1->next = NULL;
    GL->adjList[1].firstedge = tmp_node_1;
    EdgeNode* tmp_node_2 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_2->adjvex = 3;
    tmp_node_2->next = NULL;
    GL->adjList[1].firstedge->next = tmp_node_2;
    EdgeNode* tmp_node_3 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_3->adjvex = 4;
    tmp_node_3->next = NULL;
    GL->adjList[1].firstedge->next->next = tmp_node_3;

    GL->adjList[2].in = 2;
    GL->adjList[2].data = 2;
    GL->adjList[2].firstedge = NULL;

    GL->adjList[3].in = 2;
    GL->adjList[3].data = 3;
    EdgeNode* tmp_node_4 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_4->adjvex = 6;
    tmp_node_4->next = NULL;
    GL->adjList[3].firstedge = tmp_node_4;
    EdgeNode* tmp_node_5 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_5->adjvex = 7;
    tmp_node_5->next = NULL;
    GL->adjList[3].firstedge->next = tmp_node_5;
    EdgeNode* tmp_node_6 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_6->adjvex = 9;
    tmp_node_6->next = NULL;
    GL->adjList[3].firstedge->next->next = tmp_node_6;
    EdgeNode* tmp_node_7 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_7->adjvex = 10;
    tmp_node_7->next = NULL;
    GL->adjList[3].firstedge->next->next->next = tmp_node_7;

    GL->adjList[4].in = 2;
    GL->adjList[4].data = 4;
    EdgeNode* tmp_node_8 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_8->adjvex = 7;
    tmp_node_8->next = NULL;
    GL->adjList[4].firstedge = tmp_node_8;
    EdgeNode* tmp_node_9 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_9->adjvex = 8;
    tmp_node_9->next = NULL;
    GL->adjList[4].firstedge->next = tmp_node_9;
    EdgeNode* tmp_node_10 = (EdgeNode*)malloc(sizeof(EdgeNode));
    tmp_node_10->adjvex = 10;
    tmp_node_10->next = NULL;
    GL->adjList[4].firstedge->next->next = tmp_node_10;

    GL->adjList[5].in = 1;
    GL->adjList
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值