首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关键路径算法有关问题

2012-05-09 
关键路径算法问题下面是我参考严蔚敏老师《数据结构C语言版》中的关键路径算法编的程序,运行结果不正确,不知

关键路径算法问题
下面是我参考严蔚敏老师《数据结构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

结果明显不正确,求高手指正!!!

[解决办法]
差不多搞定了?你有哪些数据没?给我发一份
[解决办法]

探讨

我找到错误了总共两处!都是不小心造成的!
1,输入错误,序号应该从0开始而不是从1开始;
2,C/C++ code

tag=(ee==el)?'*':' ';//原本写成了ee=el,哎,粗心啊



下面贴出来完整正确代码及输入输出结果:
C/C++ code

#include "stdio.h"
#include "stdlib……

热点排行