10wz第10章图及其应用教程范本.ppt

  1. 1、本文档共205页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
有了每个事件的最早发生时间,就可以求出每个事件的最迟发生时间,进一步可求出每个活动的最早开始时间和最晚开始时间,最后就可以求出关键路径了。  求关键路径的算法实现如下: int CriticalPath(AdjList G) { ArcNode *p;  int i, j, k, dut, ei, li; char tag;  int vl[MAX_V_N]; /*顶点的最迟发生时间*/ int ve[MAX_V_N]; /*每个顶点的最早发生时间*/ Stack *T; if(!TopoOrder(G, T)) return(Error); //T为返回拓扑序列的栈 4 3 5 5 ^ ^ 2 5 ^ 2 ^ 4 ^ 1 3 4 2 5 6 ^ for(i=0; iG.vexnum; i++) vl[i]=ve[i];  /*初始化顶点事件的最迟发生时间*/ while(!StackEmpty(T)) /*按逆拓扑顺序求各顶点的vl值*/ { j = Pop(T);  p=G.vertex[j].firstarc; while(p! =NULL) { k=p-adjvex; dut=p-weight;  if(vl[k]-dut vl[j]) vl[j]= vl[k]-dut; p=p-nextarc;  } /* while */ } /* while*/ //T为返回拓扑序列的栈,由TopoOrder(G, T)函数获得 k1 j k2 for(j=0; jG.vexnum; j++) /*求ei, li和关键活动*/ { p = G.vertex[j].firstarc;  while(p! =NULL) { k=p-Adjvex; dut=p-weight;  ei=ve[j]; li = vl[k]-dut; tag=(ei==li) ?′*′: ′ ′;  printf(“%c, %c, %d, %d, %d, %c\n”,  G.vertex[j].data, G.vertex[k].data, dut, ei, li, tag); /*输出关键活动*/ p=p-nextarc; } /*while*/ } /* for */ return(Ok);  } /*CriticalPath*/  j k ai 拓扑排序算法的实现: 由于有向图的存储形式的不同,拓扑排序算法的实现也不同。 1) 基于邻接矩阵表示的存储结构 A为有向图G的邻接矩阵, 则有: ? 找图G中无前驱的顶点 ——在A中找到值全为0的列;  ? 删除以i为起点的所有弧 ——将矩阵中i对应的行全部置为0。 2) 基于邻接表的存储结构 入度为零的顶点即为没有前驱的顶点, 我们可以附设一个存放各顶点入度的数组indegree[ ],于是有: ? 找G中无前驱的顶点 ——查找indegree[i]为零的顶点vi;  ? 删除以i为起点的所有弧 ——对链在顶点i后面的所有邻接顶点k,将对应的indegree[k] 减1。  为了避免重复检测入度为零的顶点,可以再设置一个辅助栈,若某一顶点的入度减为0,则将它入栈。每当输出某一入度为0的顶点时,便将它从栈中删除。 3 2 1 0 4 例 1 2 3 4 5 6 4 3 5 5 ^ vex next ^ 2

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档