鱼C论坛

 找回密码
 立即注册
查看: 5286|回复: 5

关于AOE网的关键路径算法

[复制链接]
发表于 2014-12-19 10:49:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. // 边表结点声明
  2. typedef struct EdgeNode
  3. {
  4.         int adjvex;
  5.         struct EdgeNode *next;
  6. }EdgeNode;

  7. // 顶点表结点声明
  8. typedef struct VertexNode
  9. {
  10.         int in;                        // 顶点入度
  11.         int data;
  12.         EdgeNode *firstedge;
  13. }VertexNode, AdjList[MAXVEX];

  14. typedef struct
  15. {
  16.         AdjList adjList;
  17.         int numVertexes, numEdges;
  18. }graphAdjList, *GraphAdjList;

  19. int *etv, *ltv;
  20. int *stack2;                        // 用于存储拓扑序列的栈
  21. int top2;                                // 用于stack2的栈顶指针

  22. // 拓扑排序算法
  23. // 若GL无回路,则输出拓扑排序序列并返回OK,否则返回ERROR
  24. Status TopologicalSort(GraphAdjList GL)
  25. {
  26.         EdgeNode *e;
  27.         int i, k, gettop;
  28.         int top = 0;                // 用于栈指针下标索引
  29.         int count = 0;                // 用于统计输出顶点的个数
  30.         int *stack;                        // 用于存储入度为0的顶点
  31.        
  32.         stack = (int *)malloc(GL->numVertexes * sizeof(int));
  33.        
  34.         for( i=0; i < GL->numVertexes; i++ )
  35.         {
  36.                 if( 0 == GL->adjList[i].in )
  37.                 {
  38.                         stack[++top] = i;        // 将度为0的顶点下标入栈
  39.                 }
  40.         }
  41.        
  42.         // 初始化etv都为0
  43.         top2 = 0;
  44.         etv = (int *)malloc(GL->numVertexes*sizeof(int));
  45.         for( i=0; i < GL->numVertexes; i++ )
  46.         {
  47.                 etv[i] = 0;
  48.         }
  49.         stack2 = (int *)malloc(GL->numVertexes*sizeof(int));
  50.        
  51.         while( 0 != top )
  52.         {
  53.                 gettop = stack[top--];                // 出栈
  54.                 // printf("%d -> ", GL->adjList[gettop].data);
  55.                 stack2[++top2] = gettop;        // 保存拓扑序列顺序 C1 C2 C3 C4 .... C9
  56.                 count++;                               
  57.                
  58.                 for( e=GL->adjList[gettop].firstedge; e; e=e->next )
  59.                 {
  60.                         k = e->adjvex;
  61.                         // 注意:下边这个if条件是分析整个程序的要点!
  62.                         // 将k号顶点邻接点的入度-1,因为他的前驱已经消除
  63.                         // 接着判断-1后入度是否为0,如果为0则也入栈
  64.                         if( !(--GL->adjList[k].in) )       
  65.                         {
  66.                                 stack[++top] = k;
  67.                         }
  68.                        
  69.                         if( (etv[gettop]+e->weight) > etv[k] )
  70.                         {
  71.                                 etv[k] = etv[gettop] + e->weight;
  72.                         }
  73.                 }
  74.         }
  75.        
  76.         if( count < GL->numVertexes )        // 如果count小于顶点数,说明存在环
  77.         {
  78.                 return ERROR;
  79.         }
  80.         else
  81.         {
  82.                 return OK;
  83.         }
  84. }

  85. // 求关键路径,GL为有向图,输出GL的各项关键活动
  86. void CriticalPath(GraphAdjList GL)
  87. {
  88.         EdgeNode *e;
  89.         int i, gettop, k, j;
  90.         int ete, lte;
  91.        
  92.         // 调用改进后的拓扑排序,求出etv和stack2的值
  93.         TopologicalSort(GL);
  94.        
  95.         // 初始化ltv都为汇点的时间
  96.         ltv = (int *)malloc(GL->numVertexes*sizeof(int));
  97.         for( i=0; i < GL->numVertexes; i++ )
  98.         {
  99.                 ltv[i] = etv[GL->numVertexes-1];
  100.         }
  101.        
  102.         // 从汇点倒过来逐个计算ltv
  103.         while( 0 != top2 )
  104.         {
  105.                 gettop = stack2[top2--];        // 注意,第一个出栈是汇点
  106.                 for( e=GL->adjList[gettop].firstedge; e; e=e->next )
  107.                 {
  108.                         k = e->adjvex;
  109.                         if( (ltv[k] - e->weight) < ltv[gettop] )
  110.                         {
  111.                                 ltv[gettop] = ltv[k] - e->weight;
  112.                         }
  113.                 }
  114.         }
  115.        
  116.         // 通过etv和ltv求ete和lte
  117.         for( j=0; j < GL->numVertexes; j++ )
  118.         {
  119.                 for( e=GL->adjList[j].firstedge; e; e=e->next )
  120.                 {
  121.                         k = e->adjvex;
  122.                         ete = etv[j];
  123.                         lte = ltv[k] - e->weight;
  124.                        
  125.                         if( ete == lte )
  126.                         {
  127.                                 printf("<v%d,v%d> length: %d , ", GL->adjList[j].data, GL->adjList[k].data, e->weight );
  128.                         }
  129.                 }
  130.         }
  131. }
复制代码

这是小甲鱼求关键路径的算法

本人刚接触数据结构,小白一个,虚心求教,求大神帮忙指导写一个创建AOE网的算法在以上的基础
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-12-29 19:47:51 | 显示全部楼层
学习中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-24 04:03:14 | 显示全部楼层
辛苦了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-26 01:32:58 | 显示全部楼层
辛苦了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-26 22:10:18 | 显示全部楼层
LZ好人。。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-28 00:49:08 | 显示全部楼层
支持楼主!德玛西亚!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 21:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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