文档详情

第七章图报告.ppt

发布:2017-01-14约1.27万字共75页下载文档
文本预览下载声明
7.1 图的定义和术语 图(Graph):图G是由两个集合V(G)和E(G)组成的,记为G=(V,E)。其中:V(G)是顶点的非空有限集;E(G)是边的有限集合,边是顶点的无序对或有序对。 有向图:有向图G是由两个集合V(G)和E(G)组成的。其中:V(G)是顶点的非空有限集;E(G)是有向边(也称弧)的有限集合,弧是顶点的有序对,记为v,w,v,w是顶点,v为弧尾,w为弧头。 无向图:无向图G是由两个集合V(G)和E(G)组成的。其中:V(G)是顶点的非空有限集;E(G)是边的有限集合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v)。 特点 无向图中顶点Vi的度为第i个单链表中的结点数 有向图中 顶点Vi的出度为第i个单链表中的结点个数 顶点Vi的入度为整个单链表中邻接点域值是i的结点个数 逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表 2、深度优先遍历算法 一、拓扑排序 二、关键路径 4、求关键路径步骤 求Ve(i) 求Vl(j) 求e(i) 求l(i) 计算l(i)-e(i) void BFSTraverse(Graph G) { for (v=0;vG.vexnum;++v) visited[v]=FALSE; InitQueue(Q); /*置空的辅助队列Q* for (v=0;vG.vexnum;++v) if (!visited[v]) { visited[v]=TRUE; visit(v); EnQucue(Q,v); /*v入队列*/ while (!QueueEmpty(Q)){ DeQueue(Q,u); /*队头元素出队并置为u*/ for(w=FistAdjVex(G,u); w; w=NextAdjVex(G,u,w)) if (!visited[w]) { visited[w]=TRUE; visit(w); EnQueue(Q,w);} } } } 7.4 生成树 一、无向图的连通分量和生成树 1、无向图的连通分量 对于连通图,一次调用DFS或BFS即可遍历图的全部顶点;对于非连通图,多次调用DFS或BFS才能遍历完图的全部顶点。每次调用所得的顶点访问序列就是各连通分量的顶点集。 2、生成树 对于连通图,调用DFS或BFS所经过的边的集合和图的全部顶点构成了图的极小连通子图,即连通图的一棵生成树。 3、生成森林 对于非连通图,每个连通分量的顶点集和所经过的边一起构成若干棵生成树,这些连通图的生成树构成非连通图的生成森林。 一、生成树:所有顶点均由边连接在一起,但不存在回路的图。 设E(G)为连通图G中所有边的集合,则从图中任一顶点出发遍历图时,必定将E(G)分成两个集合T(G)和B(G),其中T(G)是遍历图过程中历经的边的集合;B(G)是剩余的边的集合。显然,T(G)和图G中所有顶点一起构成连通图G的极小连通子图,它是连通图的一棵生成树,并且由深度优先搜索得到的为深度优先生成树;由广度优先搜索得到的为广度优先生成树。 对于非连通图,通过这样的遍历,将得到的是生成森林。 一个图可以有许多棵不同的生成树,生成树具有以下共同特点: 1、生成树的顶点个数与图的顶点个数相同 2、生成树是图的极小连通子图 3、一个有n个顶点的连通图的生成树有n-1条边 4、生成树中任意两个顶点间的路径是唯一的 5、在生成树中再加一条边必然形成回路 6、含n个顶点n-1条边的图不一定是生成树 V1 V2 V4 V5 V3 V7 V6 V8 例 深度遍历:V1? V2 ?V4 ? V8 ?V5 ?V3 ?V6 ?V7 V1 V2 V4 V5 V3 V7 V6 V8 深度优先生成树 V1 V2 V4 V5 V3 V7 V6 V8 广度优先生成树 V1 V2 V4 V5 V3 V7 V6 V8 V1 V2 V4 V5 V3 V7 V6 V8 广度遍历:V1? V2 ?V3 ? V4 ?V5 ?V6 ?V7 ?V8 例 A B L M C F D E G H K I J A B L M C F J D E G H K I 深度优先生成森林 1、问题提出: 要在n个城市间建立通信联络网,顶点表示城市,边上的权值表示城市间建立通信线路所需花费的代价。 希望找到一棵生成树,它的所有边上的权值之和(即建立该通信网所需花费的总代价)最小—
显示全部
相似文档