关键路径c语言源程序,数据结构之-C语言实现关键路径AOE图

数据结构之---C语言实现关键路径AOE图

//关键路径AOE

//杨鑫

#include

#include

#include

//定义邻接表

typedef struct node

{

int adjvex;

int w;

struct node *nextedge;

}edgenode;

//定义边集

typedef struct

{

char data;

int id;

edgenode *firstedge;

}vexnode;

void CreateGraph(vexnode* Graph,int vexnumber,int arcnumber)

{

int i = 0, j = 0, k = 0;

int begin,end,duttem;

char ch;

edgenode *p;

for(i=0;i

{

Graph[i].id =0;

Graph[i].firstedge =NULL;

}

printf("请输入这个图中的各个顶点的值:\n");

for(i=0;i

{

scanf("%s",&ch);

Graph[i].data=ch;

}

printf("请输入图中弧的起始点及权值:其格式为\n");

for(k=0;k

{

scanf("%d,%d,%d",&begin,&end,&duttem);

p=(edgenode*)malloc(sizeof(edgenode));

p->adjvex =end-1;

p->w =duttem;

Graph[end-1].id ++;

p->nextedge =Graph[begin-1].firstedge ;

Graph[begin-1].firstedge =p;

}

}

int SearchMapPath(vexnode* Graph,int vexnumber,int arcnumber)

{

int totaltime=0;

int m=0;

int i,j,k,t;

char sv[100];

int front,rear;

int *topology_queue,*vl,*ve,*el,*ee;

front=rear=-1;

t=0;

topology_queue=(int*)malloc(vexnumber*sizeof(int));

vl=(int*)malloc(vexnumber*sizeof(int));

ve=(int*)malloc(vexnumber*sizeof(int));

el=(int*)malloc(arcnumber*sizeof(int));

ee=(int*)malloc(arcnumber*sizeof(int));

edgenode *p;

for(i=0;i

ve[i]=0;

for(i=0;i

{

if(Graph[i].id==0)

topology_queue[++rear]=i;

m++;

}

while(front!=rear)

{

front++;

j=topology_queue[front];

m++;

p=Graph[j].firstedge ;

while(p)

{

k=p->adjvex ;

Graph[k].id --;

if(ve[j]+p->w >ve[k])

ve[k]=ve[j]+p->w ;

if(Graph[k].id ==0)

topology_queue[++rear]=k;

p=p->nextedge ;

}

}

if(m

{

printf("\n本程序所建立的图有回路不可计算出关键路径\n");

printf("将退出本程序\n");

return 0;

}

totaltime=ve[vexnumber-1];

for(i=0;i

vl[i]=totaltime;

for(i=vexnumber-2;i>=0;i--)

{

j=topology_queue[i];

p=Graph[j].firstedge;

while(p)

{

k=p->adjvex ;

if((vl[k]-p->w )

vl[j]=vl[k]-p->w;

p=p->nextedge;

}

}

printf("| 起点 | 终点 | 最早开始时间 | 最迟开始时间 | 差值 | 是否为关键路径 \n");

i=0;

for(j=0;j

{

p=Graph[j].firstedge;

while(p)

{

k=p->adjvex;

ee[++i]=ve[j];

el[i]=vl[k]-p->w;

printf("| %4c | %4c | %12d | %12d | %4d |",Graph[j].data ,Graph[k].data ,ee[i],el[i],el[i]-ee[i]);

if(el[i]==ee[i])

{

printf(" 此弧为关键活动 ");

sv[t]=Graph[j].data;t++;

}

printf("\n");

p=p->nextedge;

}

}

printf("关键路径节点为:");

sv[t]=Graph[vexnumber-1].data;

for(i=0;i<=t;i++)

{

printf("%c",sv[i]);

if(sv[i]!=Graph[vexnumber-1].data)

printf("--->");

}

printf("\n");

printf("关键路径长度为:%d个单位时间\n",totaltime);

return 1;

}

int main( )

{

int vexnumber,arcnumber,totaltime=0;

printf("请输入这个图中的节点数:");

scanf("%d",&vexnumber);

printf("请输入这个图中的弧数:");

scanf("%d",&arcnumber);

vexnode* Graph=(vexnode*)malloc(vexnumber*sizeof(vexnode));

CreateGraph(Graph,vexnumber,arcnumber);

SearchMapPath(Graph,vexnumber,arcnumber);

return 0;

}

结果:

093521444.jpg

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值