/*******************************************************************************************/
//c语言关键路径第一种
#include
#include
typedef struct arcnode
{
int adjvex; //活动末端
struct arcnode *nextarc;
double info; //活动持续时间
}arcnode;
typedef struct vnode
{
int data; //事件名
arcnode *firstarc;
int du; //入度
}vnode;
typedef struct
{
int vexnum;
int actnum;
vnode *program;
}AOE;
//建立AOE网
void create(AOE T)
{
int i,start,end;
double time;
arcnode p;
T.program=(vnode *)malloc(T.vexnum*sizeof(vnode));
if(!T.program)
exit(0);
for(i=0;i<T.vexnum;i++)
{
T.program[i].data=i;
T.program[i].du=0;
T.program[i].firstarc=NULL;
}
printf("该项目的开始到结束在图中的点的输入 i,j,info ");
printf("如:4,5,9回车表示第四节点到第五节点之间的活动用了9个单位时间 ");
for(i=0;i<T.actnum;i++)
{
scanf("%d,%d,%lf",&start,&end,&time);
p=(arcnode)malloc(sizeof(arcnode));
p->adjvex=end-1;
T.program[end-1].du++;
p->info=time;
p->nextarc=T.program[start-1].firstarc;
T.program[start-1].firstarc=p;
}
}
//找关键路径
void crtical_activity(AOE T)
{
int stack=(int)malloc((T.vexnum+1)*sizeof(int));
double ve=(double)malloc(T.vexnum*sizeof(double)); //储存事件最早发生时间
double vl=(double)malloc(T.vexnum*sizeof(double)) ; //储存事件最晚发生时间
double e=(double)malloc(T.actnum*sizeof(double)); //存储活动最早发生时间
double l=(double)malloc(T.actnum*sizeof(double)); //储存活动最晚发生时间
int i,j,k,top=0,bottom=0;
arcnode *p;
double sumtime=0.0;
for(i=0;i
{
if(T.program[i].du==0)
{
stack[top++]=i;
}
}
while(top!=bottom)
{
i=stack[bottom++];
p=T.program[i].firstarc;
while(p)
{
k=p->adjvex;
T.program[k].du--;
if(T.program[k].du==0)
{
stack[top++]=k;
}
if(ve[k]info)
{
ve[k]=ve[i]+p->info;
}
p=p->nextarc;
}
}
sumtime=ve[T.vexnum-1];
for(i=0;i
{
vl[i]=ve[T.vexnum-1];
}
for(i=T.vexnum;i>=0;i--)
{
int k=stack[i];
p=T.program[k].firstarc;
while(p)
{
j=p->adjvex;
if(vl[j]-p->info
{
vl[k]=vl[j]-p->info;
}
p=p->nextarc;
}
}
printf("|起点|终点|最早开始时间|最迟开始时间|差|判断| ");
i=0;
for(j=0;j
{
p=T.program[j].firstarc;
while(p)
{
int k=p->adjvex;
e[++i]=ve[j];
l[i]=vl[k]-p->info;
printf("|%4d|%4d|%lf|%lf|%lf|",T.program[j].data+1,T.program[k].data+1,e[i],l[i],l[i]-e[i]);
if(l[i]==e[i])
{
printf("关键活动| ");
}
printf(" ");
p=p->nextarc;
}
}
printf("整个工程所用的最短时间为: %lf个单位时间 ",sumtime);
}
int main()
{
AOE t;
printf("请输入AOE网的事件个数: ");
scanf("%d",&t.vexnum);
printf("请输入AOE网的活动个数: ");
scanf("%d",&t.actnum);
create(t);
crtical_activity(t);
return 0;
}
/****************************************************************************************************/
//第二种
/*
#include "stdio.h"
#include "stdlib.h"
#define MAX 50
typedef struct ArcNode
{
int adjvex;
int info;//权值
struct ArcNode *nextarc;
}ArcNode;
typedef struct Vnode
{
char data;
int inDegree;
ArcNode *link;
}Vnode,AdjList[MAX+1];
typedef struct
{
AdjList vertices;
int vexnum;
int arcnum;
}ALGraph;
void CreateGraph(ALGraph &G)
{
int i,j,s,d,w;
ArcNode p;
ArcNode *t;
for(i=0;i<G.vexnum;i++)
{
getchar();
printf("第%d个结点信息(char)型:",i);
scanf("%c",&G.vertices[i].data);
G.vertices[i].inDegree=0;
G.vertices[i].link=NULL;
}
for(i=0;i<G.arcnum;i++)
{
printf("第%d条边----起点序号,终点序号,权值:",i);
scanf("%d %d %d",&s,&d,&w);
p=(ArcNode)malloc(sizeof(ArcNode));
p->adjvex=d;
p->info=w;
p->nextarc=G.vertices[s].link;
G.vertices[s].link=p;
}
for(i=0;i
{
int counter=0;
for(j=0;j
{
if (j!=i)
{
t=G.vertices[j].link;
while (t)
{
if (t->adjvex==i)
{
counter++;
}
t=t->nextarc;
}
}
}
G.vertices[i].inDegree=counter;
}
}
void OutputGraph(ALGraph &G)
{
int i;
ArcNode *p;
printf("遍历图的结果如下: ");
for(i=0;i
{
printf("[%c(%d)]",G.vertices[i].data,G.vertices[i].inDegree);
p=G.vertices[i].link;
while (p!=NULL)
{
printf("---->%d",p->adjvex);
p=p->nextarc;
}
printf(" ");
}
}
int ve[MAX+1]={0};
int stack2[MAX+1];
int top2=0;
void TopologicalOrder(ALGraph &G)
{
int stack[MAX+1];
ArcNode *p;
int i,top=0,k;
for(i=0;i
if (G.vertices[i].inDegree==0)
{
stack[top++]=i;
}
int count=0;
while (top>0)
{
i=stack[--top];
stack2[top2++]=i;
//printf("(%d,%c)",i,G.vertices[i].data);
++count;
for(p=G.vertices[i].link;p;p=p->nextarc)
{
k=p->adjvex;
if (--G.vertices[k].inDegree==0)
{
stack[top++]=k;
}
if ((ve[i]+p->info)>ve[k])
{
ve[k]=ve[i]+p->info;
}
}
}
if (count<G.vexnum)
{
printf("网中有环!");
}
}
void CriticalPath(ALGraph G)
{
TopologicalOrder(G);
int vl[MAX+1];
int j;
ArcNode* p;
int k,dut,ee,el;
char tag;
for(int i=0;i
{
vl[i]=ve[G.vexnum-1];
}
while (top2>0)
{
j=stack2[--top2];
for(p=G.vertices[j].link;p;p=p->nextarc)
{
k=p->adjvex;
dut=p->info;
if (vl[k]-dut
{
vl[j]=vl[k]-dut;
}
}
}
for(j=0;j
for(p=G.vertices[j].link;p;p=p->nextarc)
{
k=p->adjvex;
dut=p->info;
ee=ve[j];
el=vl[k]-dut;
tag=(ee==el)?'*':' ';
printf("活动%d--->%d权值:%d 最早开始时间%d 最晚开始时间%d 是否关键活动:%c ",j,k,dut,ee,el,tag);
}
}
int main()
{
ALGraph G;
printf("输入节点数和边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
CreateGraph(G);
TopologicalOrder(G);
CriticalPath(G);
return 0;
}
*/