- 8
- 0
- 约2.1万字
- 约 92页
- 2019-11-06 发布于广东
- 举报
假设N={V,E}是连通网,TE是N的最小生成树,将N中的边按权值从小到大的顺序排列,构造最小生成树的步骤如下: (1) 初始时,TE中只有n个顶点,每个顶点自成一个分量,而TE的边的集合TE=。 (2) 当TE的边数小于n-1时,重复执行以下步骤: ① 在连通网N的边集E中选择权值最小的边(vi,vj),并从E中删除之。 ② 如果vi和vj分别落在不同的连通分量上,则将该边加入到TE中,否则丢掉该边,继续在E中选择一条权值最小的边。 例如,图7.25就是利用卡鲁斯卡尔算法构造最小生成树的过程。 卡鲁斯卡尔算法用C语言描述如下。 void Kruskal(MGraph G) /*克鲁斯卡尔算法构造最小生成树*/ { int set[MAXVERTEX],i,j; int a=0,b=0,min=G.arc[a][b].adj,k=0; for(i=0;iG.vexnum;i++) /*初始时,各顶点分别属于不同的集合*/ set[i]=i; printf(最小生成树的各条边为:\n); while(kG.vexnum-1) /*查找所有最小权值的边*/ { for(i=0;iG.vexnum;i++) /*在矩阵的上三角查找最小权值的边*/ for(j=i+1;jG.vexnum;j++) if(G.arc[i][j].adjmin) { min=G.arc[i][j].adj; a=i; b=j; } min=G.arc[a][b].adj=INFINITY; /*删除上三角中最小权值的边,下次不再查找*/ if(set[a]!=set[b]) /*如果边的两个顶点在不同的集合*/ { printf(%s-%s\n,G.vex[a],G.vex[b]);/*输出最小权值的边*/ k++; for(i=0;iG.vexnum;i++) if(set[i]==set[b])/*将顶点b所在集合并入顶点a集合中 */ set[i]=set[a]; } } } 7.4.2 有向无环图 有向无环图(Directed Acyclic Graph)是指一个没有环的有向图,简称DAG。有向无环图可用来描述工程或系统的进行过程。在有向无环图描述工程的过程中,将工程分为若干个活动,即子工程。 1. 拓扑排序 用顶点表示活动,用弧表示活动间的优先关系的有向无环图,称为顶点表示活动的网Activity On Vertex Network,简称AOV网。 例如,计算机科学与技术专业的必修课程及先修课程的关系可以用AOV网表示,学习这些课程的过程可以看成是一项工程,学习每一门课程可以看成是一个活动。必修课程及先修课程的关系如表7.2所示。 对AOV网进行拓扑排序的基本思想如下: (1) 在AOV网中任意选择一个无前驱的顶点,即顶点入度为零,将该顶点输出; (2) 从AOV网中删除该顶点和从该顶点出发的弧; (3) 重复执行步骤(1)和(2),直到AOV网中不存在无前驱的结点; (4) 若此时输出的结点数小于有向图的顶点数,则说明有向图中存在回路,否则输出的顶点顺序即为一个拓扑序列。 按照以上步骤,图7.27所示的AOV网的拓扑序列为 (C1,C2,C3,C4,C5,C6,C7,C8,C9,C10)或(C6,C7,C8,C9,C1,C2,C3,C4,C5,C10 图7.28是AOV网的拓扑序列的构造过程。其拓扑序列为:V1、V2、V3、V5、V4、V6。 2. 关键路径 有向图在工程管理中有着广泛的应用。用有向图表示工程管理时通常有两种方法: (1) 用顶点表示活动,用有向弧表示活动间的优先关系,即上节讨论的AOV网。 (2) 用顶点表示事件,用弧表示活动,弧的权值表示活动所需要的时间。 把用第二种方法构造的有向无环图称为边表示活动的网(Activity On Edge Network),简称为AOE网。 图7.29是一个具有10个活动、8个事件的AOE网。v1, v2, …, v8表示8个事件,v1,v2,v1,v3, …, v7,v8表示10个活动,a1, a2, …, a10表示活动的执行时间。进入顶点的有向弧表示的活动已经完成,从顶点出发的有向弧表示的活动可以开始。顶点v1表示整个工程的开始,v8表示整个工程的结束。顶点v5表示活动a4, a5, a6已经完成,活动a7和a8可以开始。其中,完成活动a5和活动a6分别需要5天和6天。 在AOE网中从源点到汇点的最长路径的长度即为完成整个工程任务所需要的时间,该路径叫做关键路径。关键路径上的活动叫做关键活动。
原创力文档

文档评论(0)