文章目录
前言
关键路径是指设计中从输入到输出经过的延时最长的逻辑路径。优化关键路径是一种提高设计工作速度的有效方法。一般地,从输入到输出的延时取决于信号所经过的延时最大路径,而与其他延时小的路径无关。
提示:以下是本篇文章正文内容,下面案例可供参考
一、关键路径代码展示
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]);
}
}
}