什么是DAG图中的关键路径?简单的将就是不可以推辞的活动组成的路径,这对于工程上有着极其重要的应用,利用关键路径算法可以计算那些事件是不可推辞的,必须如期完成,下面是代码:
//关键路径算法
//图的邻接矩阵表示法
#include
#include
#include
#include
#include
using namespace std;
#define Max 100
#define Inf 0x1111
typedef char type;
typedef struct Grap{
type data[Max];
int value[Max][Max];
int n,m;
}Grap,*pgrap;
int Located(pgrap g,char ch){
for(int i=0;in;i++)
if(g->data[i]==ch)
return i;
}
int invalue[Max];
int ve[Max];
int vl[Max];
bool trag;
stack s;
stack t;
void Creat_grap(pgrap g){
printf("输入图的顶点数和边数:\n");
scanf("%d%d",&g->n,&g->m);
//printf("ksgfdkj\n");
getchar();
printf("输入图中的顶点:\n");
int i,j;
for(i=0;in;i++){
g->data[i]=getchar();
getchar();
}
for(i=0;in;i++)
for(j=0;jn;j++)
g->value[i][j]=Inf;
printf("请输入图中的边:\n");
int index1,index2,value;
char ch1,ch2;
while(g->m--){
scanf("%c,%c,%d",&ch1,&ch2,&value);
getchar();
index1=Located(g,ch1);
index2=Located(g,ch2);
g->value[index1][index2]=value;
//无向图
//g->value[index2][index1]=value;
}
}
void In_value(pgrap g){
memset(invalue,0,sizeof(invalue));
for(int i=0;in;i++)
for(int j=0;jn;j++)
if(g->value[j][i]!=Inf)
invalue[i]++;
}
void tuopu(pgrap g){
int i,index,count=0;
trag=true;
memset(ve,0,sizeof(ve));
for(i=0;in;i++)
if(invalue[i]==0)
s.push(i);
while(!s.empty()){
index=s.top();
s.pop();
t.push(index);
count++;
for(i=0;in;i++)
if(g->value[index][i]!=Inf){
if(--invalue[i]==0)
s.push(i);
if(ve[index]+g->value[index][i]>ve[i])
ve[i]=ve[index]+g->value[index][i];
}
}
if(countn)
trag=false;
}
void Keyway(pgrap g){
if(!trag){
printf("图中存在环\n");
return ;
}
int i,j,index,end=t.top();
for(i=0;in;i++)
vl[i]=ve[end];
while(!t.empty()){
index=t.top();
t.pop();
for(i=0;in;i++)
if(g->value[index][i]!=Inf)
if(vl[i]-g->value[index][i]value[index][i];
}
int early,later;
char tragg;
for(i=0;in;i++)
for(j=0;jn;j++)
if(g->value[i][j]!=Inf){
early=ve[i];
later=vl[j]-g->value[i][j];
tragg=(early==later)?'Y':'N';
printf("类型,起点,终点,最早发生时间,最晚发生时间,活动耗时\n");
printf("%c,%c,%c,%d,%d,%d\n",tragg,g->data[i],g->data[j],early,later,g->value[i][j]);
}
}
int main(){
Grap g;
pgrap p=&g;
Creat_grap(p);
In_value(p);
tuopu(p);
Keyway(p);
return 0;
}
测试数据:
输入图的顶点数和边数:
6 9
输入图中的顶点:
A
B
C
D
E
F
请输入图中的边:
A,B,1
A,C,3
B,D,4
B,C,1
C,D,1
D,E,2
C,E,1
E,F,1
D,F,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
Y,A,B,0,0,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,A,C,0,1,3
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,B,C,1,3,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
Y,B,D,1,1,4
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,C,D,3,4,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,C,E,3,6,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
Y,D,E,5,5,2
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,D,F,5,7,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
Y,E,F,7,7,1
Terminated with return code 0
Press any key to continue ...