关键路径算法问题
下面是我参考严蔚敏老师《数据结构C语言版》中的关键路径算法编的程序,运行结果不正确,不知道程序哪里出错了,求改正!下面我贴出来
- C/C++ code
#include "stdio.h"#include "stdlib.h"#define MAX 50typedef 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<G.vexnum;i++) { int counter=0; for(j=0;j<G.vexnum;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("遍历图的结果如下:\n"); for(i=0;i<G.vexnum;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("\n"); }}int ve[MAX+1]={0};int stack2[MAX+1];int top2=0;void TopologicalOrder(ALGraph &G){ int stack[MAX+1]; ArcNode *p; int top=0,k; for(int i=0;i<G.vexnum;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<G.vexnum;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[j]=vl[k]-dut; } } } for(j=0;j<G.vexnum;++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\n",j,k,dut,ee,el,tag); }}void main(){ ALGraph G; printf("输入节点数和边数:"); scanf("%d %d",&G.vexnum,&G.arcnum); CreateGraph(G); TopologicalOrder(G); CriticalPath(G);}
输入输出如下:
输入节点数和边数:6 8
第0个结点信息(char)型:a
第1个结点信息(char)型:b
第2个结点信息(char)型:c
第3个结点信息(char)型:d
第4个结点信息(char)型:e
第5个结点信息(char)型:f
第0条边----起点序号,终点序号,权值:1 2 3
第1条边----起点序号,终点序号,权值:1 3 2
第2条边----起点序号,终点序号,权值:2 4 2
第3条边----起点序号,终点序号,权值:2 5 3
第4条边----起点序号,终点序号,权值:3 4 4
第5条边----起点序号,终点序号,权值:3 6 3
第6条边----起点序号,终点序号,权值:4 6 2
第7条边----起点序号,终点序号,权值:5 6 1
活动1--->3权值:2 最早开始时间-858993468 最晚开始时间-858993468 是否关键活动:*
活动1--->2权值:3 最早开始时间-858993467 最晚开始时间-858993467 是否关键活动:*
活动2--->5权值:3 最早开始时间-858993464 最晚开始时间-858993464 是否关键活动:*
活动2--->4权值:2 最早开始时间-858993464 最晚开始时间-858993464 是否关键活动:*
活动3--->6权值:3 最早开始时间-858993463 最晚开始时间-858993463 是否关键活动:*
活动3--->4权值:4 最早开始时间-858993466 最晚开始时间-858993466 是否关键活动:*
活动4--->6权值:2 最早开始时间-858993462 最晚开始时间-858993462 是否关键活动:*
活动5--->6权值:1 最早开始时间-858993461 最晚开始时间-858993461 是否关键活动:*
Press any key to continue
结果明显不正确,求高手指正!!!
[解决办法]
差不多搞定了?你有哪些数据没?给我发一份
[解决办法]