关于图的关键路径问题
我写了一个计算图的关键路径的程序,可是出来的最早和最晚老是一样的,关键活动也不对,高手帮忙看看那里错了
程序代码:#include "iostream.h"
#include "stdlib.h"
#include "malloc.h"
#define MAX 30
typedef struct node
{
int vex;
struct node *next;
}edgenode;
typedef struct vnode
{
int id;
struct node *link;
}vexnode;
typedef struct nodel
{
int adgvex;
int dut;
struct nodel *next;
}edgenodel;
typedef struct vnodel
{
int vertex;
int id;
struct nodel *link;
}vexnodel;
int na;
int creatAOE(vexnodel dig[]);
int creatAOV(vexnode dig[]);
void toposort(vexnode dig[],int n);
void criticalpath(vexnodel dig[],int n);
void main()
{
vexnodel dig[MAX];
vexnode dig2[MAX];
int n=0;
int cord=1;
while (1)
{
cout<<" 主菜单 "<<endl;
cout<<"1.建立AOV邻接链表"<<endl;
cout<<"2.建立AOE邻接链表"<<endl;
cout<<"3.拓扑排序"<<endl;
cout<<"4.求关键路径"<<endl;
cout<<"输入代码选择:(1-4),0表示结束"<<endl;
cin>>cord;
switch(cord)
{
case 1:
n=creatAOV(dig2);
break;
case 2:
cout<<"input Arcs:";
cin>>na;
n=creatAOE(dig);
break;
case 3:
toposort(dig2,n);
break;
case 4:
criticalpath(dig,n);
break;
case 0:
exit(9);
}
}
}
int creatAOE(vexnodel dig[])
{
int vextotal,j,a,b,c;
edgenodel *p;
cout<<"input vex number:";
cin>>vextotal;
for(j=0;j<MAX;j++)
{
dig[j].vertex=j;
dig[j].id=0;
dig[j].link=NULL;
}
for(j=1;j<=na;j++)
{
cout<<"input edge<i,j>weight:";
cin>>a>>b>>c;
dig[b].id++;
p=(edgenodel*)malloc(sizeof(edgenodel));
p->adgvex=b;
p->dut=c;
p->next=dig[a].link;
dig[a].link=p;
}
cout<<"output link table"<<endl;
for(j=1;j<=vextotal;j++)
{
cout<<j<<" "<<dig[j].id<<" ";
p=dig[j].link;
while (p!=0)
{
cout<<p->adgvex<<" "<<p->dut<<" ";
p=p->next;
}
cout<<endl;
}
return(vextotal);
}
int creatAOV(vexnode dig[])
{
int vextotal,arcnumber,j,a,b;
edgenode *p;
cout<<" input vex number:";
cin>>vextotal;
cout<<" input Arc number:";
cin>>arcnumber;
for(j=0;j<MAX;j++)
{
dig[j].id=0;
dig[j].link=NULL;
}
for(j=1;j<=arcnumber;j++)
{
cout<<" input vex number<i,j>:"<<endl;
cin>>a>>b;
dig[b].id++;
p=(edgenode*)malloc(sizeof(edgenode));
p->vex=b;
p->next=dig[a].link;
dig[a].link=p;
}
cout<<" output link table"<<endl;
for(j=1;j<=vextotal;j++)
{
cout<<j<<" "<<dig[j].id<<" ";
p=dig[j].link;
while (p!=NULL)
{
cout<<p->vex<<" ";
p=p->next;
}
cout<<endl;
}
return(vextotal);
}
void toposort(vexnode dig[],int n)
{
edgenode *p;
int i,j,k,top,m;
top=0;
m=0;
for(i=0;i<n;i++)
{
if (dig[i].id==0)
{
dig[i].id=top;
top=i;
}
}
while (top>0)
{
j=top;
top=dig[top].id;
cout<<j;
m++;
p=dig[j].link;
while (p!=NULL)
{
k=p->vex;
dig[k].id--;
if (dig[k].id==0)
{
dig[k].id=top;
top=k;
}
p=p->next;
}
cout<<" ";
}
if (m<n)
cout<<" The network has acycle."<<endl;
}
void criticalpath(vexnodel dig[],int n)
{
int front=0,rear=0;
int tpord[20],vl[20],ve[20];
int l[20],e[20],i,j,k,m;
edgenodel *p;
for(i=1;i<=n;i++) ve[i]=0;
for(i=1;i<=n;i++)
if(dig[i].id==0) tpord[++rear]=i;
m=0;
while (front!=rear)
{
front++;
j=tpord[front];
m++;
p=dig[j].link;
while (p)
{
k=p->adgvex;
dig[k].id--;
if(dig[k].id==0) tpord[++rear]=k;
if(ve[j]+p->dut>ve[k]) ve[k]=ve[j]+p->dut;
p=p->next;
}
}
if (m<n) cout<<" The AOE network has acycle"<<endl;
for(i=1;i<=n;i++) vl[i]=ve[i];
for(i=n;i>0;i--)
{
j=tpord[i];
p=dig[j].link;
while (p)
{
k=p->adgvex;
if ((vl[k]-p->dut)<vl[j]) vl[j]=vl[k]-p->dut;
p=p->next;
}
}
cout<<" output VE VL"<<endl;
for(i=1;i<=n;i++)
cout<<ve[i]<<" "<<vl[i]<<endl;
for(j=1,i=1;j<=n;j++,i++)
{
p=dig[j].link;
while (p)
{
k=p->adgvex;
e[i]=ve[j];
l[i]=vl[k]-p->dut;
cout<<dig[j].vertex<<" "<<dig[k].vertex<<" "<<e[i]<<" "<<l[i]<<" "<<l[i]-e[i];
if (l[i]==e[i])
cout<<" CRITICAL ACTIVITY"<<endl;
else
cout<<endl;
p=p->next;
}
}
}






