第8章-图数据结构课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第8章-图数据结构课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件
- 资源描述:
-
1、2023-2-1112023-2-112数据结构 线性-表:每个元素有一个直接前趋和一直接后继非线性 每一层元素可能和下层中的多个元素相关,但只能和上一层中的一个 元素相关 数据元素之间的关系是任意的树:图:2023-2-113图的定义:Graph=(V,E)G=(V,E)V:是顶点的有穷非空集合 E:边的集合(边:顶点的偶对)2023-2-114 V(G1)=V1,V2,V3,V4 E(G1)=(v1,v2),(v1,v3),(v1,v4),(v2,v3),(v2,v4),(v3,v4)V2V4V3V1G1例子:2023-2-115V2V1V3V(G2)=v1,v2,v3 E(G2)=,例子
2、:始点 终点2023-2-116环多重图2023-2-1172023-2-1182023-2-119ni=1e=1/2(TD(Vi)2023-2-1110V3V2V1 ID(V2)=1 TD(V2)=3 OD(V2)=22023-2-11111132413134121432312023-2-11122023-2-11132023-2-1114 非连通图 (极大连通子图叫做连通分量)2023-2-11152023-2-1116V1V2V3V4V523451011862023-2-11172023-2-11182023-2-1119 1 如果E 或 (i,j)E AEdge i j=0 否则202
3、3-2-1120V0V3V1V2V4V3V2V1V0对称矩阵0 1 1 1 1 0 1 1 1 1 0 01 1 0 0 AEdge=0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0AEdge=2023-2-1121031212835496AEdge=0 1 4 0 9 23 5 0 8 6 0 w(i,j)如果ij且 E或(i,j)EAEdgei j=如果ij且 E或(i,j)E 0 i=j 例子:2023-2-1122V0V1V2V3.dataMaxsize012n-12023-2-11232023-2-11242023-2-1125202
4、3-2-1126V2V1V4V3n 个结点,e条边的无向图需用n+2e个单位.V1 V2 V4 V3 3 1 1 2 0 0 0 3 2 1 data adjdest link顶点表NodeTable边链接表Edge Linked List01232023-2-1127V1V2V3311642邻接表V1 V2 V3 2 2 2 11 0 3 0 6 1 4 data adjdest cost link顶点表出边表012V1 V2 V3 1 2 2 3 0 11 0 4 1 6 data adjdest cost link顶点表入边表逆邻接表0122023-2-1128边的三个数据成员2023-
5、2-1129data adjNodeTable2023-2-1130图的私有数据成员2023-2-11312023-2-11322023-2-11332023-2-11342023-2-11352023-2-1136 V1V2V3V4e1e2e4e3e5V1 V2 V4 V3 data Firstout0 1 0 2 0 3 1 3 1 2 vertex1 path1vertex2 path2e1e2e3e4e52023-2-1137ADEBCe3e6e5e4e2e1A B C 1 2 D E 3 4 2 3 4 0 0 1 data Firstin Firstout 0 3 mark v1
6、v2 p1 p22023-2-11382023-2-11392023-2-1140v1v2v6v5v4v3v8v7V1V2V4V8V5V3V6V7v1v2v6v5v4v3v8v7深度优先生成树2023-2-11412023-2-1142用图的抽象数据类型来实现 算法分析:用邻接表表示 O(n+e)用邻接矩阵表示 O(n2)2023-2-11432023-2-1144v1v2v6v5v4v3v8v7 算法同样需要一个辅助数组visited 表示顶点是否被访问过.还需要一个队列,记正在访问的这一层和上一层的顶点.算法显然是非递归的.v1v2v6v5v4v3v8v7广度优先生成树V1V2V3V4V
7、5V6V7V82023-2-11452023-2-11462023-2-11472023-2-1148ABCDEFGHJIKLMNO非连通无向图非连通图的连通分量ABCDEFGA,B,F,G,E,C,DHJI H,I,J KLMNOK,L,O,M,N2023-2-11492023-2-11508.4 最小生成树最小生成树 2)生成树不唯一生成树的代价:TE(G)上诸边的代价之和n个结点的生成树有n-1条边。1.生成树的有关概念1)生成树的定义设G=(V,E)是一个连通的无向图(或是强连通有向图)从图G中的任一顶点出发作遍历图的操作,把遍历走过的边的集合记为TE(G),显然 G=(V,TE)是G
8、之子图,G被称为G的生成树(spanning tree),也称为一个连通图2023-2-11513)最小代价生成树(minimun-cost spanning tree)问题的提出:如何找到一个网络的最小生成树,即各边权的总和为最小的生成树从同一个结点出发遍历可的不同的树从不同的结点出发遍历可得不同的树2023-2-1152实际例子:6个城市已固定,现从一个城市发出信息到每一个城市 如何选择或铺设通信线路,使花费(造价)最低。前提:每条边有代价 1423566551426356如果用广度优先,则12345661534=192023-2-1153最小代价生成树14235612354=15书中介绍
9、了两个算法:Prim,Kruskal.它们都采用了逐步求解(Grandy)的策略。2023-2-1154Grandy策略:设:连通网络N=V,E,V中有n个顶点。1.先构造n个顶点,0条边的森林F=T0,T1,.,Tn-1每次向F中加入一条边。该边是一端在F的某棵树Ti上 而另一端不在Ti上的所有边中具有最小权植的边。这样使F中两棵树合并为一棵,树的棵数-1 重复n-1次 T0Tn-1 T12023-2-1155最小生成树的类声明:const int MAXINT=机器可表示的,问题中不可能出现的大数class MinSpanTree;class MSTEdgeNode friend clas
10、s MinSpanTree;private:int tail,head;int cost;tailcosthead边的结构:2023-2-1156class MinSpanTree public:MinSpanTree(int SZ=NumVertices-1):MaxSize(SZ),n(0)edgevalue=new MSTEdgeNodeMaxSize;protected:MSTEdgeNode*edgevalue;/边值数组 int MaxSize,n;/数组的最大元素个数和/当前个数;2023-2-1157Kruskal算法1)把无向图中的所有边排序 1342521012986372
11、 3 6 7 8 9 10 12(1,2)(3,5)(3,4)(4,5)(2,3)(2,5)(1,4)(1,3)2)一开始的最小生成树为 T (V,)即由 n个不同的连通分量组成TE=2023-2-11583)在E中选一条代价最小的边(u,v)加入T,一定要满足(u,v)不和TE中已有的边构成回路,EE-(u,v),TE=TE(u,v)4)一直到TE中加满n-1条边为止。2023-2-1159134521345221345223134522361345223682023-2-11602023-2-1161(2)取最小的边以及判别是否构成回路,利用最小堆 (MinHeap)和并查找集(Disjo
12、intSets)克鲁斯卡尔算法:void Graph:Kruskal(MinSpanTree&T)MSTEdgeNode e;MinHeapH(currentEdges);int NumVertices=VerticesList.Last,u,v;Ufsets F(NumVertices);/建立n个单元素的连通分量 for(u=0;uNumVertices;u+)for(v=u+1;vNumVertices;v+)if(Edgeuv!=MAXINT)e.tail=u;e.head=v;e.cost=Edgeuv;H.insert(e);/建立边的最小堆 int count=1;/生成树边计数
13、 while(countNumVertices)H.RemoveMin(e);u=F.Find(e.tail);v=F.Find(e.head);if(u!=v)F.union(u,v);T.Insert(e);count+;2023-2-1162算法分析:1)建立e条边的最小堆。每插入一条边,执行一次 filterup()算法:log2e 所以,总的建堆时间为O(e*log2e)检测邻接矩阵O(n2)2)构造最小生成树时:e次出堆操作:每一次出堆,执行一次filterdown(),总时间为O(elog2e)2e次find操作:O(e*log2n)n-1次union操作:O(n)所以,总的计算
14、时间为O(e*log2e+e*log2n+n2+n)2023-2-1163 3.Prim算法 设:原图的顶点集合V(有n 个)生成树的顶点集合 U(最后也有n个),一开始为空 TE集合为 步骤:1)U=1任何起始顶点,TE=2)每次生成(选择)一条边。这条边是所有边(u,v)中代 价(权)最小的边,uU,v V-U TE=TE+(u,v);U=U+v 3)当UV 2023-2-1164用一开始的例子:14235665514263562023-2-11651423566551426356123456U V-U5条中找最小1423566551426356132456U V-U8条中找最小14235
15、665514263562023-2-11669条中找最小136245U V-U142356614263568条中找最小136425U V-U1 14235614263562023-2-11675条中找最小13645U V-U42356142351=152023-2-1168具体实现:1)图采用邻接矩阵2)设置了两个辅助数组:改进了实现效率 最小生成树不是唯一的,因为权相等的边不止一条时可任选一条。2023-2-1169Lowcost:存放生成树顶点集合内顶点到生成树外各顶点的边上的 当前最小权值;nearvex:记录生成树顶点集合外各顶点,距离集合内那个顶点最近。书中例子:从顶点0出发初始状态
16、Lowcost:nearvex:0 1 2 3 4 5 60 1 2 3 4 5 60 28 10-1 0 00 0 00如果为-1则表示已加入生成树顶点集合28161214182422101543265012023-2-11701)在Lowcost中选择nearvexi-1,且lowcostI 最小的边,用v标记它。选中的权值最小的边为(nearvexv,v),相应的权值为lowcostv。如在图8.20的例子中第一次选中的v=5;则边(0,5),是选中的权 值最小的边,相应的权值为lowcost5=10。反复做以下工作:2)将nearvexv 改为-1,表示它已加入生成树顶点集合。将边(n
17、earvexv,v,lowcostv)加入生成树的边集合。2023-2-11713)比较。取lowcosti=minlowcosti,Edgevi,即用生成树顶点集 合外各顶点I到刚加入该集合的新顶点v的距离(Edgevi)与原来它 所到生成树顶点集合中顶点的最短距离lowcosti做比较,取距离 近的,作为这些集合外顶点到生成树顶点集合内顶点的最短 距离。4)如果生成树顶点集合中外顶点 i刚加入该集合新顶点v的距离 比原来它到生成树顶点集合中顶点的最短距离还要近,则修改 nearvexi:nearvexi=v.表示生成树外顶点I到生成树的内顶点v 当前距离最短。2023-2-1172-100
18、00-100123456028100123456nearvexlowcost(0,5,10)10151234560UV-U2023-2-11730512346UV-U-10005-10012345602825100123456nearvexlowcost(5,4,25)10542512023-2-11740541236-1034-1-1301234560283222510180123456nearvexlowcost(4,3,22)105UV-U42521222023-2-11750543126-103-1-1-13012345602812222510180123456nearvexlowco
19、st(3,2,12)105UV-U42512232122023-2-11760543226-1-1-1-1-1-1-1012345601612222510140123456nearvexlowcost(2,1,16)UV-U10542502232121162023-2-11770543216-1-1-1-1-1-1-1012345601612222510140123456nearvexlowcost(1,6,14)UV-U10542502232121166142023-2-1178Prim(普里姆)算法void graph:Prim(MinSpanTree&T)int NumVertices=
20、VerticesList.last;float*lowcost=new floatNumVertices;int*nearvex=new intNumVertices;for(int i=1;i NumVertices;i+)lowcosti=Edge0i;nearvexi=0;nearvex0=-1;MSTEdgeNode e;for(int i=1;i NumVertices;i+)float min=MAXINT;int v=0;for(int j=1;j NumVertices;j+)2023-2-1179if(nearvexj!=-1&lowcostjmin)v=j;min=lowc
21、ostj;if(v)e.tail=nearvexv;e.head=v;e.cost=lowcostv;T.Insert(e);nearvexv=-1;for(int j=1;j NumVertices;j+)if(nearvexj!=-1&Edgevjlowcostj)lowcostj=Edgevj;nearvexj=v;2023-2-1180算法结构为:n 求最小的n 修改n所以时间复杂度:O(n2)2023-2-11818.5 最短路径(最短路径(shortest path)三种算法:1.边上权值非负情况的从一个结点到其它各结点的最短路径 (单源最短路径-Dijkstra算法)2.边上权值
22、为任意值的单源最短路径 3.所有顶点之间的最短路径 设G=(V,E)是一个带权图(有向,无向),如果从顶点v到顶点w的一条路径为(v,v1,v2,w),其路径长度不大于从v到w的所有其它路径的长度,则该路径为从v到w的最短路径。背景:交通网络中,求各城镇间的最短路径。2023-2-11821.含非负权值的单源最短路径(Dijkstra)1)问题04123101003050201060V0 V110V0 V3 V250V0 V330V0 V3 V2 V460如果按距离递增的顺序重新排列一下经过终止 距离V0 V1 10V0 V3 30V0 V3 V2 50V0 V3 V2 V4 600 1 2
展开阅读全文