【数据结构】图的关键路径实现

引言:

        关键路径是图论中的一个重要概念,用于确定图中的关键任务和最长路径。关键路径分析可以帮助我们确定图中任务的执行顺序和时间安排。关键路径分析对于项目管理非常重要。通过确定关键路径,项目经理可以合理安排任务的执行顺序和时间,确保项目按计划进行。同时,关键路径分析还可以帮助项目经理识别潜在的风险和瓶颈,及时采取措施解决问题。

技术实现:

        首先定义拓扑排序的结构体,定义边表结点方便后续关于拓扑排序及关键路径的计算。

代码如下:

#include
#include
#include

#define MAXVEX 100
int* etv, * ltv;
int* stack2;
int top2;

typedef struct EdgeNode {
	int adjvex;
	int weight;
	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;

        

        接下来使用拓扑排序算法确定任务的执行顺序。拓扑排序算法通过计算每个顶点的入度来确定顶点的执行顺序。入度为0的顶点可以作为起始点,然后依次处理它的后继顶点,直到所有顶点都被处理完。

代码如下:

int TopologicalSort(GraphAdjList GL) {
	EdgeNode* e;
	int i, k, gettop;
	int top = 0;
	int count = 0;
	int* stack;
	stack = (int*)malloc(GL->numVertexes * sizeof(int));
	for (i = 0; i < GL->numVertexes; i++) {
		if (0 == GL->adjList[i].in) {
			stack[++top] = i;
		}
	}
	top2 = 0;
	etv = (int*)malloc(GL->numVertexes * sizeof(int));
	while (top!=0)
	{
		gettop = stack[top--];
		count++;
		stack2[++top2] = gettop;

		for (e = GL->adjList[gettop].firstedge; e; e = e->next) {
			k = e->adjvex;
			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) {
		return -1;
	}
	else return 0;
}

        在进行拓扑排序的同时,我们还可以计算每个顶点的最早开始时间(etv)和最晚开始时间(ltv)。最早开始时间表示在不延误整个项目的情况下,任务可以开始的最早时间。最晚开始时间表示在不延误整个项目的情况下,任务必须开始的最晚时间。        

        通过计算etv和ltv,我们可以确定每个任务的关键路径。关键路径上的任务具有相同的最早开始时间和最晚开始时间,它们的差值表示任务的浮动时间。如果某个任务的浮动时间为0,则说明该任务是整个项目的关键任务,必须按时完成。 

代码如下:

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];
	}
	while (top2!=0)
	{
		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;
			}
		}
	}
	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("length%d", GL->adjList[j].data, GL->adjList[k], e->weight);
			}
		}
	}
}

总结:

        关键路径分析对于项目管理非常重要。它可以帮助项目经理合理安排任务的执行顺序和时间,确保项目按计划进行。同时,关键路径分析还可以帮助项目经理识别潜在的风险和瓶颈,及时采取措施解决问题。通过关键路径分析,项目经理可以更好地掌控项目进度和资源分配,提高项目的成功率和效率。  

 

 

你可能感兴趣的:(数据结构,数据结构,算法,经验分享)