⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aoe.cpp

📁 该算法用于分析AOE网络,求出AOE网络的关键路径.
💻 CPP
字号:
//求AOE网络关键路径
#include<stdio.h> 
#include<stdlib.h> 
typedef struct node 
{int adjvex; 
int dut; 
struct node *next; 
}edgenode; 
typedef struct 
{int projectname; 
int id; 
edgenode*link; 
}vexnode; 
void CreateGraphic(vexnode*Graphicmap,int projectnumber,int activenumber) 
{int begin,end,duttem; 
edgenode *p; 
for(int i=0;i<projectnumber;i++) 
{Graphicmap[i].projectname=i; 
Graphicmap[i].id =0; 
Graphicmap[i].link =NULL; 
}   
printf("输入<vi,vj,dut>\n"); 
printf("1,2,3表示第1节点到第2节点之间的活动用了3个单位时间\n"); 
for(int k=0;k<activenumber;k++)
{scanf("%d,%d,%d",&begin,&end,&duttem); 
p=(edgenode*)malloc(sizeof(edgenode)); 
p->adjvex=end-1; 
p->dut=duttem; 
Graphicmap[end-1].id ++; 
p->next=Graphicmap[begin-1].link ; 
Graphicmap[begin-1].link =p; 
} 
} 
int SearchMapPath(vexnode* Graphicmap,int projectnumber,int activenumber,int&totaltime) 
{int i,j,k,m=0; 
int front=-1,rear=-1; 
int*topologystack=(int*)malloc(projectnumber*sizeof(int));
int*vl=(int*)malloc(projectnumber*sizeof(int));
int*ve=(int*)malloc(projectnumber*sizeof(int)); 
int*l=(int*)malloc(activenumber*sizeof(int));
int*e=(int*)malloc(activenumber*sizeof(int));
edgenode *p; 
totaltime=0; 
for(i=0;i<projectnumber;i++)ve[i]=0; 
for(i=0;i<projectnumber;i++) 
{if(Graphicmap[i].id==0) 
{topologystack[++rear]=i; 
m++; 
} 
} 
while(front!=rear) 
{front++; 
j=topologystack[front]; 
m++; 
p=Graphicmap[j].link ; 
while(p) 
{k=p->adjvex ; 
Graphicmap[k].id --; 
if(ve[j]+p->dut >ve[k]) 
ve[k]=ve[j]+p->dut ; 
if(Graphicmap[k].id ==0) 
topologystack[++rear]=k; 
p=p->next ; 
} 
} 
if(m<projectnumber) 
{printf("\n本程序所建立的图有回路\n");
return 0; 
}
totaltime=ve[projectnumber-1]; 
for(i=0;i<projectnumber;i++) 
vl[i]=totaltime; 
for(i=projectnumber-2;i>=0;i--) 
{j=topologystack[i]; 
p=Graphicmap[j].link ; 
while(p) 
{k=p->adjvex ; 
if((vl[k]-p->dut )<vl[j]) 
vl[j]=vl[k]-p->dut ; 
p=p->next ; 
} 
} 
i=0; 
printf("| 起点 | 终点 |   e  |   l  |  l-e |  是否关键活动  |\n"); 
for(j=0;j<projectnumber;j++) 
{p=Graphicmap[j].link; 
while(p) 
{k=p->adjvex ; 
e[++i]=ve[j]; 
l[i]=vl[k]-p->dut; 
printf("| %4d | %4d | %4d | %4d | %4d |",Graphicmap[j].projectname +1,Graphicmap[k].projectname +1,e[i],l[i],l[i]-e[i]); 
if(l[i]==e[i]) 
printf(" 关键活动 |"); 
printf("\n"); 
p=p->next ; 
} 
} 
return 1; 
} 
void seekkeyroot() 
{int projectnumber,activenumber,totaltime=0; 
printf("请输入这个工程的图的节点数:"); 
scanf("%d",&projectnumber); 
printf("请输入这个工程的活动个数:"); 
scanf("%d",&activenumber); 
vexnode* Graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode)); 
CreateGraphic(Graphicmap,projectnumber,activenumber); 
SearchMapPath(Graphicmap,projectnumber,activenumber,totaltime); 
printf("整个工程所用的最短时间为:%d个单位时间\n",totaltime); 
} 
void main() 
{seekkeyroot(); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -