📄 aoe.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<iomanip.h>
#include <process.h>
typedef struct node
{
int adjvex;
int dut;
struct node *next;
}edgenode;
typedef struct
{
int projectname;
int id;
edgenode *link;
}vexnode;
void CreateGraphic(vexnode*,int,int);
int SearchPath(vexnode*,int,int,int&);
void main()
{
int flag,projectnum,activenum,totaltime=0;
printf("请输入这个工程的化成图形的结点数:");
scanf("%d",&projectnum);
printf("请输入这个工程的活动个数:");
scanf("%d",&activenum);
vexnode* Graphicmap=(vexnode*)malloc(projectnum*sizeof(vexnode));
CreateGraphic(Graphicmap,projectnum,activenum);
flag=SearchPath(Graphicmap,projectnum,activenum,totaltime);
if(flag==0)
printf("\n本程序所建立的图有回路不可计算出关键路径\n");
else
printf("\n全工程可以完成的最早时间为:%d个单位时间\n",totaltime);
system("pause");
}
void CreateGraphic(vexnode* Graphicmap,int projectnum,int activenum) //创建图的函数
{
int begin,end,duttem;
edgenode *p;
for(int i=0;i<projectnum;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<activenum;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 SearchPath(vexnode* Graphicmap,int projectnum,int activenum,int& totaltime)//查找关键路径
{
int i,j,k,m=0;
int front=-1,rear=-1;
int* topologystack=(int*)malloc(projectnum*sizeof(int));//保存拓扑排列
int* vl=(int*)malloc(projectnum*sizeof(int));//表示在不推迟整个工程的前提下,Vj允许最迟发生的时间
int* ve=(int*)malloc(projectnum*sizeof(int));//表示Vj最早发生时间
int* l=(int*)malloc(activenum*sizeof(int));//表示活动Ai最迟完成开始时间
int* e=(int*)malloc(activenum*sizeof(int));//表示活动最早开始时间
edgenode *p;
totaltime=0;
for(i=0;i<projectnum;i++) ve[i]=0;
for(i=0;i<projectnum;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<projectnum)
{
return 0;
}
totaltime=ve[projectnum-1];
for(i=0;i<projectnum;i++)
vl[i]=totaltime;
for(i=projectnum-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(" 起点 终点 最早开始时间 最迟完成时间 差值 是否为关键活动(*) \n");
for(j=0;j<projectnum;j++)
{
p=Graphicmap[j].link;
while(p)
{
k=p->adjvex ;
e[++i]=ve[j];
l[i]=vl[k]-p->dut;
printf("%6d%8d%13d%18d%12d ",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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -