问题描述
- 为什么第一个程序不能正常运行
-
/*******************************************************************************************/
//c语言关键路径第一种
#include
#includetypedef 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;
}*/
解决方案
代码太长了,建议自己调试下看看