三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 427|回复: 0
打印 上一主题 下一主题

C语言数据结构-algo7-5.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 09:27:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo7-5.c 求关键路径。实现算法7.13、7.14的程序 */
  2. #include"c1.h"
  3. #define MAX_NAME 5 /* 顶点字符串的最大长度+1 */
  4. typedef int InfoType;
  5. typedef char VertexType[MAX_NAME]; /* 字符串类型 */
  6. #include"c7-2.h"
  7. #include"bo7-2.c"

  8. int ve[MAX_VERTEX_NUM]; /* 全局变量(用于算法7.13和算法7.14) */

  9. void FindInDegree(ALGraph G,int indegree[])
  10. { /* 求顶点的入度,算法7.12、7.13调用 */
  11.    int i;
  12.    ArcNode *p;
  13.    for(i=0;i<G.vexnum;i++)
  14.      indegree[i]=0; /* 赋初值 */
  15.    for(i=0;i<G.vexnum;i++)
  16.    {
  17.      p=G.vertices[i].firstarc;
  18.      while(p)
  19.      {
  20.        indegree[p->adjvex]++;
  21.        p=p->nextarc;
  22.      }
  23.    }
  24. }

  25. typedef int SElemType; /* 栈类型 */
  26. #include"c3-1.h"
  27. #include"bo3-1.c"
  28. Status TopologicalOrder(ALGraph G,SqStack *T)
  29. { /* 算法7.13  有向网G采用邻接表存储结构,求各顶点事件的最早发生时间ve */
  30.    /* (全局变量)。T为拓扑序列顶点栈,S为零入度顶点栈。若G无回路,则用栈T */
  31.    /* 返回G的一个拓扑序列,且函数值为OK,否则为ERROR */
  32.    int j,k,count,indegree[MAX_VERTEX_NUM];
  33.    SqStack S;
  34.    ArcNode *p;
  35.    FindInDegree(G,indegree);/*对各顶点求入度indegree[0..vernum-1] */
  36.    InitStack(&S); /* 初始化栈 */
  37.    for(j=0;j<G.vexnum;++j) /* 建零入度顶点栈S */
  38.      if(!indegree[j])
  39.        Push(&S,j); /* 入度为0者进栈 */
  40.    InitStack(T); /* 初始化拓扑序列顶点栈 */
  41.    count=0; /* 对输出顶点计数 */
  42.    for(j=0;j<G.vexnum;++j) /* 初始化ve[]=0 (最小值) */
  43.      ve[j]=0;
  44.    while(!StackEmpty(S))
  45.    { /* 栈不空 */
  46.      Pop(&S,&j);
  47.      Push(T,j); /* j号顶点入T栈并计数 */
  48.      ++count;
  49.      for(p=G.vertices[j].firstarc;p;p=p->nextarc)
  50.      { /* 对j号顶点的每个邻接点的入度减1 */
  51.        k=p->adjvex;
  52.        if(--indegree[k]==0) /* 若入度减为0,则入栈 */
  53.          Push(&S,k);
  54.        if(ve[j]+*(p->info)>ve[k])
  55.          ve[k]=ve[j]+*(p->info);
  56.      }
  57.    }
  58.    if(count<G.vexnum)
  59.    {
  60.      printf("此有向网有回路\n");
  61.      return ERROR;
  62.    }
  63.    else
  64.      return OK;
  65. }

  66. Status CriticalPath(ALGraph G)
  67. { /* 算法7.14 G为有向网,输出G的各项关键活动 */
  68.    int vl[MAX_VERTEX_NUM];
  69.    SqStack T;
  70.    int i,j,k,ee,el;
  71.    ArcNode *p;
  72.    char dut,tag;
  73.    if(!TopologicalOrder(G,&T)) /* 产生有向环 */
  74.      return ERROR;
  75.    j=ve[0];
  76.    for(i=1;i<G.vexnum;i++) /* j=Max(ve[]) 完成点的值 */
  77.      if(ve[i]>j)
  78.        j=ve[i];
  79.    for(i=0;i<G.vexnum;i++) /* 初始化顶点事件的最迟发生时间(最大值) */
  80.      vl[i]=j; /* 完成点的最早发生时间 */
  81.    while(!StackEmpty(T)) /* 按拓扑逆序求各顶点的vl值 */
  82.      for(Pop(&T,&j),p=G.vertices[j].firstarc;p;p=p->nextarc)
  83.      {
  84.        k=p->adjvex;
  85.        dut=*(p->info); /* dut<j,k> */
  86.        if(vl[k]-dut<vl[j])
  87.          vl[j]=vl[k]-dut;
  88.      }
  89.    printf(" j  k  dut  ee  el  tag\n");
  90.    for(j=0;j<G.vexnum;++j) /* 求ee,el和关键活动 */
  91.      for(p=G.vertices[j].firstarc;p;p=p->nextarc)
  92.      {
  93.        k=p->adjvex;
  94.        dut=*(p->info);
  95.        ee=ve[j];
  96.        el=vl[k]-dut;
  97.        tag=(ee==el)?'*':' ';
  98.        printf("%2d %2d %3d %3d %3d    %c\n",j,k,dut,ee,el,tag); /* 输出关键活动 */
  99.      }
  100.    printf("关键活动为:\n");
  101.    for(j=0;j<G.vexnum;++j) /* 同上 */
  102.      for(p=G.vertices[j].firstarc;p;p=p->nextarc)
  103.      {
  104.        k=p->adjvex;
  105.        dut=*(p->info);
  106.        if(ve[j]==vl[k]-dut)
  107.          printf("%s→%s\n",G.vertices[j].data,G.vertices[k].data); /* 输出关键活动 */
  108.      }
  109.    return OK;
  110. }

  111. void main()
  112. {
  113.    ALGraph h;
  114.    printf("请选择有向网\n");
  115.    CreateGraph(&h);
  116.    Display(h);
  117.    CriticalPath(h);
  118. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-5-12 01:12 , Processed in 0.026077 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表