数据结构13图的经典算法--关键路径


前言

关键路径是指设计中从输入到输出经过的延时最长的逻辑路径。优化关键路径是一种提高设计工作速度的有效方法。一般地,从输入到输出的延时取决于信号所经过的延时最大路径,而与其他延时小的路径无关。


提示:以下是本篇文章正文内容,下面案例可供参考

一、关键路径代码展示

void criticalpath(graphmtx *g)
{
	int n=g->numvertice;
	int* ve=(int *)malloc(sizeof(int)*n);
	int* vl=(int *)malloc(sizeof(int)*n);
	//初始化
	for(int i=0;i<n;i++)
	{
		ve[i]=0;
		vl[i]=max;
	}
	//ve
	for(i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(g->edge[i][j]+ve[i]>ve[j]&&g->edge[i][j]!=max)
			{
				ve[j]=g->edge[i][j]+ve[i];
			}
		}
	}
/*	for(i=0;i<n;i++)
		printf("%d\n",ve[i]);
		*/
	vl[n-1]=ve[n-1];
	for(i=n-2;i>=0;i--)
	{
		for(int j=0;j<n;j++)
		{
			if(vl[j]-g->edge[i][j]<vl[i]&&g->edge[i][j]!=max)
			{
				vl[i]=vl[j]-g->edge[i][j];
			}
		}
	}
/*	for(i=0;i<n;i++)
		printf("%d  %d\n",ve[i],vl[i]);
		*/
	for(i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(ve[i]==vl[i]&&ve[j]==vl[j]&&g->edge[i][j]!=max&&i!=j)
				printf("关键路径<%c %c>\n",g->verticelist[i],g->verticelist[j]);
		}
	}
}

二、全部代码

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

#define defaultnum 10
#define t char
#define max 200

typedef struct graphmtx
{
	int maxvertice;
	int numvertice;
	int numedge;

	t *verticelist;
	int **edge;
}graphmtx;


void initgraph(graphmtx *g);
void showgraph(graphmtx *g);
void insertvertice(graphmtx *g,t e);
int findpos(graphmtx *g,t e);
void insertedge(graphmtx *g,t e1,t e2,int cost);
void shortestpath(graphmtx *g);
void criticalpath(graphmtx *g);



void main()
{
	graphmtx gm;
	initgraph(&gm);
	insertvertice(&gm,'A');
	insertvertice(&gm,'B');
	insertvertice(&gm,'C');
	insertvertice(&gm,'D');
	insertvertice(&gm,'E');
	insertvertice(&gm,'F');
	insertvertice(&gm,'G');
	insertvertice(&gm,'H');
	insertvertice(&gm,'I');

	insertedge(&gm,'A','B',6);
	insertedge(&gm,'A','C',4);
	insertedge(&gm,'A','D',5);
	insertedge(&gm,'B','E',1);
	insertedge(&gm,'C','E',1);
	insertedge(&gm,'D','F',2);
	insertedge(&gm,'F','H',2);
	insertedge(&gm,'E','G',9);
    insertedge(&gm,'E','H',7);
	insertedge(&gm,'G','I',2);
	insertedge(&gm,'H','I',4);
	showgraph(&gm);

	//shortestpath(&gm);

	criticalpath(&gm);
	
}




void initgraph(graphmtx *g)
{
	g->maxvertice=defaultnum;
	g->numedge=g->numvertice=0;

	g->verticelist=(t*)malloc(sizeof(t)*defaultnum);
	assert(g->verticelist !=NULL);

	g->edge=(int **)malloc(sizeof(int *)*defaultnum);
	assert(g->edge!=NULL);

	for(int i=0;i<g->maxvertice;++i)
	{
		g->edge[i]=(int *)malloc(sizeof(int)*defaultnum);
	}
	for(i=0;i<g->maxvertice;++i)
	{
		for(int j=0;j<g->maxvertice;++j)
		{
			if(i==j)
				g->edge[i][j]=0;
			else
				g->edge[i][j]=max;
		}
	}
}



void showgraph(graphmtx *g)
{
	printf("    ");
	for(int i=0;i<g->numvertice;i++)
		printf("%c   ",g->verticelist[i]);
	printf("\n");
	for(i=0;i<g->numvertice;i++)
	{
		printf("%c   ",g->verticelist[i]);
		for(int j=0;j<g->numvertice;j++)
		{
			if(g->edge[i][j]==max)
			{
				printf("@   ");
			}
			else{
				printf("%d  ",g->edge[i][j]);
			}
		}
		printf("\n");
	}
	printf("\n");

}


void insertvertice(graphmtx *g,t e)
{
	if(g->numedge>g->numvertice)
	{
		printf("已满");
		return;
	}
	g->verticelist[g->numvertice++]=e;

}


int findpos(graphmtx *g,t e)
{
	for(int i=0;i<g->numvertice;i++)
	{
		if(g->verticelist[i]==e)
			return i;
	}
	return -1;
}



void insertedge(graphmtx *g,t e1,t e2,int cost)
{
	int p=findpos(g,e1);
	int w=findpos(g,e2);
	if(p==-1||w==-1)
		return;
	if(g->edge[p][w]!=max)
		return;
	g->edge[p][w]=cost;
}



void shortestpath(graphmtx *g)
{
	int n=g->numvertice;
	int* dist=(int *)malloc(sizeof(int)*n);
	int* path=(int *)malloc(sizeof(int)*n);
	int* s=(int *)malloc(sizeof(int)*n);
	//初始化
	for(int i=0;i<n;i++)
		{
			if(i!=0)
			{
				dist[i]=g->edge[0][i];
				path[i]=0;
			}
			else
			{
				dist[i]=0;
				path[i]=-1;
			}
			s[i]=0;
		}
		s[0]=1;
		int w;
	for(i=0;i<n;i++)
	{
		int min=max;
		for(int j=0;j<n;j++)
		{
			if(i!=j&&dist[j]<min&&s[j]==0)
			{
				w=j;
				min=dist[j];
			}
		}
		s[w]=1;
		for(int k=0;k<n;k++)
		{
			if(w!=k&&min+g->edge[w][k]<dist[k])
			{
				dist[k]=min+g->edge[w][k];
				path[k]=w;
			}
		}
	}

	for(i=0;i<n;i++)
	{
		printf("%d  %d \n",path[i],dist[i]);
	}
	printf("\n");
}




void criticalpath(graphmtx *g)
{
	int n=g->numvertice;
	int* ve=(int *)malloc(sizeof(int)*n);
	int* vl=(int *)malloc(sizeof(int)*n);
	//初始化
	for(int i=0;i<n;i++)
	{
		ve[i]=0;
		vl[i]=max;
	}
	//ve
	for(i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(g->edge[i][j]+ve[i]>ve[j]&&g->edge[i][j]!=max)
			{
				ve[j]=g->edge[i][j]+ve[i];
			}
		}
	}
/*	for(i=0;i<n;i++)
		printf("%d\n",ve[i]);
		*/
	vl[n-1]=ve[n-1];
	for(i=n-2;i>=0;i--)
	{
		for(int j=0;j<n;j++)
		{
			if(vl[j]-g->edge[i][j]<vl[i]&&g->edge[i][j]!=max)
			{
				vl[i]=vl[j]-g->edge[i][j];
			}
		}
	}
/*	for(i=0;i<n;i++)
		printf("%d  %d\n",ve[i],vl[i]);
		*/
	for(i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(ve[i]==vl[i]&&ve[j]==vl[j]&&g->edge[i][j]!=max&&i!=j)
				printf("关键路径<%c %c>\n",g->verticelist[i],g->verticelist[j]);
		}
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值