清华大学朱明方数据结构5.ppt
《清华大学朱明方数据结构5.ppt》由会员分享,可在线阅读,更多相关《清华大学朱明方数据结构5.ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章第五章 图图5.1 图的基本概念图的基本概念 一一.图的定义图的定义 二二.顶点的度顶点的度 三三.路径与连通路径与连通5.2 图的存储结构图的存储结构 一一.邻接矩阵邻接矩阵 二二.邻接表邻接表 三三.边集数组边集数组 四四.邻接多重表邻接多重表5.3 图的遍历图的遍历 一一.深度优先遍历深度优先遍历 二二.广度优先遍历广度优先遍历5.4 最短距离问题最短距离问题5.1 图的基本概念图的基本概念一一.图的定义图的定义 图图图形结构简称。允许集合中的元素间有任意前后件关系。图形结构简称。允许集合中的元素间有任意前后件关系。即数据元素间是多对多的联系。每个元素构成一个顶点。即数据元素间是多
2、对多的联系。每个元素构成一个顶点。图的二元组定义为:图的二元组定义为:G=(V,E)V顶点集合,顶点集合,EV上的一个二元关系。上的一个二元关系。例如,图:例如,图:G1=(V(G1),E(G1)V(G1)=A,B,C E(G1)=A,B,A,C,B,C,C,B 每个序偶对应一条每个序偶对应一条有向边有向边(带箭头的边带箭头的边)G2=(V(G2),E(G2)V(G2)=v1,v2,v3 E(G2)=(v1,v2),(v1,v3),(v2,v3)每个无序对对应一条每个无序对对应一条无向边无向边(无箭头的边无箭头的边)AB CG1 V1V2 V3G25.1 图的基本概念图的基本概念一一.图的定义
3、图的定义 E(G1)、E(G2)可以看成是边可以看成是边(有向边或无向边有向边或无向边)的集合。的集合。根据图的二元组定义,根据图的二元组定义,G=(V,E)有:有:图图由顶点集合由顶点集合V和边集合和边集合E组成。组成。图图G1中的边为有向边中的边为有向边有向图。有向图。图图G2中的边为无向边中的边为无向边无向图。无向图。若图若图G =(V,E)与图与图G=(V,E)满足:满足:V(G)V(G),E(G)E(G)则称则称G 为为G的子图。的子图。例如,图例如,图G:图图G:G 为为G的子图的子图 AB CG1 V1V2 V3G2AB DE FCAB CE5.1 图的基本概念图的基本概念二二.
4、顶点的度顶点的度 无向图:无向图:边边(Vi,Vj),端点端点Vi,Vj互为邻接点。互为邻接点。顶点的度顶点的度顶点连接的边数顶点连接的边数D(Vi),若图中每两个顶点间都有边若图中每两个顶点间都有边完全图完全图边数边数为最大值为最大值n(n-1)/2。有向图:有向图:边边 Vi,Vj Vi的出边、的出边、Vj的入边;的入边;起点起点ViVj的入边邻接点的入边邻接点;终点终点VjVi的出边邻接点的出边邻接点。顶点入度顶点入度顶点连接的入边数;顶点连接的入边数;D-(Vi)顶点出度顶点出度顶点连接的出边数;顶点连接的出边数;D+(Vi)顶点的度顶点的度=顶点入度顶点入度+顶点出度。顶点出度。设顶
5、点设顶点i的度为的度为D(Vi),图中有图中有n个顶点个顶点,则其边数则其边数m为:为:m=握手定理。握手定理。推论推论:图中度为奇数的顶点有偶数个。:图中度为奇数的顶点有偶数个。AB DE F例如:例如:AB CD例如:例如:5.1 图的基本概念图的基本概念三三.路径与连通路径与连通无向图,若存在边:无向图,若存在边:(vp,vi1),(vi1,vi2),(vin-1,vin),(vin,vq),有向图,若存在边:有向图,若存在边:vp,vi1,vi1,vi2 ,vin-1,vin ,vin,vq ,则:则:顶点序列顶点序列(vp,vi1,vin,vq)为为vp到到vq的一条的一条路经路经。
6、路径长度路径长度路径上所有边的数目。路径上所有边的数目。顶点顶点vi到到vj有路径有路径vi到到vj连通连通。无向图中,任意两顶点都连通无向图中,任意两顶点都连通连通图连通图。极大的连通子图极大的连通子图连通分量连通分量。有向图中,任意两顶点都连通有向图中,任意两顶点都连通强连通图强连通图。极大的强连通子图极大的强连通子图强连通分量强连通分量。(c)强连通图强连通图 (d)强连通分量强连通分量(a)连通图连通图(b)连通分连通分量量AB C DEA BD CAB CDA BD CA BD C5.1 图的基本概念图的基本概念三三.路径与连通路径与连通 实际问题中抽象出来的图,图中每条边上可以标有
7、具体实际问题中抽象出来的图,图中每条边上可以标有具体 意义的数值意义的数值 边上的数值边上的数值边的权。边的权。边上有权的图边上有权的图带权图带权图(有值图、网有值图、网)。例如,例如,(a)带权无向图带权无向图 (b)带权有向图带权有向图 A BE D57 1083215C 4 8 10 6 1 7 5 2ab ec d5.2 图的存储结构图的存储结构一一.邻接矩阵表示邻接矩阵表示 方法:方法:用一个一维数组存储顶点信息;用一个一维数组存储顶点信息;用一个矩阵用一个矩阵(二维数组二维数组)表示顶点的邻接关系。表示顶点的邻接关系。设图设图G中有中有n个顶点,其序号分别为个顶点,其序号分别为1,
8、2,n,数组数组D(1:n)存储顶点信息;存储顶点信息;二维数组二维数组A(1:n,1:n)存储存储n个顶点的邻接关系个顶点的邻接关系邻接矩阵邻接矩阵 例如例如,图图:邻接矩阵:邻接矩阵:12 3bac12 3BAC1231231 2 31 2 35.2 图的存储结构图的存储结构一一.邻接矩阵表示邻接矩阵表示 带权图的邻接矩阵表示带权图的邻接矩阵表示:设用二维数组设用二维数组A(1:n,1:n)存储带权图存储带权图n个顶点的邻接关系;个顶点的邻接关系;表示表示任一边的权值。任一边的权值。例如,图:例如,图:邻接矩阵:邻接矩阵:10 1120 12 3 bac12312312 3BAC12 16
9、461 2 31 2 35.2 图的存储结构图的存储结构一一.邻接矩阵表示邻接矩阵表示 邻接矩阵中容易实现:邻接矩阵中容易实现:查找图中任意一条边或边上的权查找图中任意一条边或边上的权(带权图带权图);查找任意顶点的邻接点;查找任意顶点的邻接点;确定任一顶点的度。确定任一顶点的度。前例:前例:查找的时间复杂度查找的时间复杂度O(n),n顶点数顶点数 当边数当边数n2时,存储空间利用率低。时,存储空间利用率低。123 结点结点1的边、的边、度度、邻接点邻接点123 结点结点1的出边、的出边、出出 度度、邻接点邻接点 结点结点1的入度、的入度、入边入边、邻接点邻接点 5.2 图的存储结构图的存储结
10、构二二.邻接表表示邻接表表示 方法:方法:(1)对图中每个顶点建立一个邻接关系的单链表对图中每个顶点建立一个邻接关系的单链表顶点邻接表顶点邻接表;(2)用一个向量存各邻接表头指针。用一个向量存各邻接表头指针。邻接表结点邻接表结点(边结点边结点):表头结点:表头结点:若是无权图,表结点中无权值域。若是无权图,表结点中无权值域。例如,图:例如,图:邻接表:邻接表:出边邻接关系。出边邻接关系。顶点号顶点号权值权值下一邻接点下一邻接点元素元素第一个邻接结点指针第一个邻接结点指针 12 3bac 1 2 3BACABCabc21123020303020305.2 图的存储结构图的存储结构二二.邻接表表示
11、邻接表表示 邻接表中,邻接表中,便于:便于:找任一顶点的边找任一顶点的边(或出边或出边);找任一顶点的邻接点找任一顶点的邻接点(或出边邻接点或出边邻接点)、度度(出度出度)平均查找的时间复杂度:平均查找的时间复杂度:O(e/n)不便于:不便于:查找任一顶点的入边和入边邻接点查找任一顶点的入边和入边邻接点(有向图有向图)。逆邻接表:逆邻接表:对每个顶点建立链接入边邻接点的单链表。对每个顶点建立链接入边邻接点的单链表。例如,图:例如,图:逆邻接表:逆邻接表:逆邻接表中,逆邻接表中,便于:便于:查找任一顶点的入边或入边上的权;查找任一顶点的入边或入边上的权;查找任一顶点的入边邻接点、入度。查找任一顶
12、点的入边邻接点、入度。1a2b3c30113020 12 3bac5.2 图的存储结构图的存储结构二二.邻接表表示邻接表表示三三.十字邻接表十字邻接表(有向图有向图)四四.表结构:把邻接表与逆邻接表结合为一个表。表结构:把邻接表与逆邻接表结合为一个表。五五.链表结点:链表结点:六六.表头结点:表头结点:七七.例如,图:例如,图:八八.九九.十字邻接表:十字邻接表:十十.邻接矩阵的第邻接矩阵的第i行行邻接表中第邻接表中第i个单链表个单链表十一十一.邻接矩阵的第邻接矩阵的第i列列逆邻接表中第逆邻接表中第i个单链表个单链表1a2b3c310 12 3bac3200121302300十字链表。十字链表
13、。元素元素入边指针入边指针出边指针出边指针边起点边起点边终点边终点权值权值下一入边指针下一入边指针 下一出边指针下一出边指针5.2 图的存储结构图的存储结构三三.边集数组表示边集数组表示方法:方法:用一个一维数组存储顶点信息;用一个一维数组存储顶点信息;利用一个数组存图中所有的边利用一个数组存图中所有的边,数组元素个数数组元素个数图边数;图边数;数组中每个元素存储一条边的起点、终点、权值,数组中每个元素存储一条边的起点、终点、权值,次序任意。次序任意。无向图,边起点可以任意选定;无权图,省去权值存储。无向图,边起点可以任意选定;无权图,省去权值存储。例如,图:例如,图:边集数组:边集数组:适合
14、:适合:对边依次处理的运算。对边依次处理的运算。123112起点起点.233终点终点.1234起点起点1123终点终点2332权值权值12164612 3BAC12 1646 12 3bac 5.2 图的存储结构图的存储结构四四.邻接多重表表示邻接多重表表示(无向图无向图)方法:方法:图中每一条边用一个存储结点表示,图中每一条边用一个存储结点表示,有一端点相同的边连接在一起。有一端点相同的边连接在一起。边边(i,j)结点:结点:顶点结点:顶点结点:例如,图:例如,图:邻接多重表:邻接多重表:适合:适合:对指定边进行操作。对指定边进行操作。12 3bac顶点值顶点值指向第一条边指向第一条边标志标
15、志 顶点顶点i指向指向i的下一条边的下一条边顶点顶点j指向指向j的下一条边的下一条边1a2b3c2312010305.3 图的遍历图的遍历 遍历:遍历:从某顶点出发从某顶点出发,按一定搜索方法按一定搜索方法,不重复访问所有顶点。不重复访问所有顶点。问题:问题:可能存在多条路径都能到达同一顶点。可能存在多条路径都能到达同一顶点。解决办法:解决办法:对已访问过的顶点做标记对已访问过的顶点做标记(用一个辅助数组用一个辅助数组)。遍历方法:遍历方法:深度优先搜索遍历,广度优先搜索遍历。深度优先搜索遍历,广度优先搜索遍历。一一.深度优先搜索遍历深度优先搜索遍历(纵向优先搜索遍历纵向优先搜索遍历)思路:思
16、路:与树的先根遍历类似。与树的先根遍历类似。方法:方法:访问一个顶点访问一个顶点vi,并将其标记为已访问;并将其标记为已访问;从从vi的一个未访问过的邻接点出发,的一个未访问过的邻接点出发,做深度优先搜索遍历;做深度优先搜索遍历;当当vi的所有邻接点均已访问时,则回退到上一个顶点的所有邻接点均已访问时,则回退到上一个顶点vk,从从vk的另一未访问的邻接点开始做深度优先遍历的另一未访问的邻接点开始做深度优先遍历。显见:是一个递归过程。显见:是一个递归过程。5.3 图的遍历图的遍历一一.深度优先搜索遍历深度优先搜索遍历二二.例如,图:例如,图:三三.四四.从顶点从顶点1出发出发(初始顶点初始顶点)
17、,做深度优先遍历的过程为:,做深度优先遍历的过程为:五五.访问访问v1(结点值结点值A),标记标记v1,取取v2做深度优先遍历;做深度优先遍历;六六.访问访问v2(B),标记标记v2,取取v5做深度优先遍历;做深度优先遍历;七七.访问访问v5(E),标记标记v5,取取v6做深度优先遍历;做深度优先遍历;八八.访问访问v6(F),标记标记v6,回退回退 v5 v2;九九.ABCDEFG 1 2 3 456 75.3 图的遍历图的遍历一一.深度优先搜索遍历深度优先搜索遍历二二.例如,图:例如,图:三三.四四.访问访问v7(G),标记标记v7,取取v3做深度优先遍历做深度优先遍历;五五.访问访问v3
18、(C),标记标记v3,回退回退 v7,取取v4做深度优先遍历做深度优先遍历;六六.访问访问v4(D),标记标记v4,回退回退 v7 v2 v1;过程结束。过程结束。七七.遍历结果:遍历结果:A,B,E,F,G,C,D八八.1.深度优先遍历的递归算法描述深度优先遍历的递归算法描述ABCDEFG 1 2 3 456 75.3 图的遍历图的遍历一一.深度优先搜索遍历深度优先搜索遍历二二.1.深度优先遍历的递归算法描述深度优先遍历的递归算法描述三三.遍历算法描述与其存储方式有关。遍历算法描述与其存储方式有关。四四.假设用邻接矩阵表示图假设用邻接矩阵表示图:五五.例如,图:例如,图:邻接矩阵邻接矩阵六六
19、.七七.若定义数组若定义数组MARK(1:n)记录记录n个顶点的访问标志:个顶点的访问标志:八八.定义数组定义数组A(1:n,1:n)表示图的邻接矩阵。表示图的邻接矩阵。ABCDEFG 1 2 3 456 712345671 2 3 4 5 6 75.3 图的遍历图的遍历一一.深度优先搜索遍历深度优先搜索遍历二二.1.深度优先遍历的递归算法深度优先遍历的递归算法三三.若以若以vi(顶点顶点i)为初始顶点,深度优先搜索遍历算法:为初始顶点,深度优先搜索遍历算法:四四.输入:顶点数组输入:顶点数组V(1:n),邻接矩阵邻接矩阵A(1:n,1:n),五五.标志数组标志数组MARK(1:n),顶点数顶
20、点数n,初始顶点号初始顶点号i六六.输出:深度优先遍历序列输出:深度优先遍历序列七七.PROCEDURE DFS1(A,V,MARK,n,i)以以Vi为初始顶点深度优先搜为初始顶点深度优先搜索遍历索遍历八八.PROCESS (V(i)访问顶点访问顶点i九九.MARK(i)1 标记顶点标记顶点i已访问已访问十十.FOR j=1 TO n DO 依次搜索依次搜索Vi的所有邻接点的所有邻接点十一十一.IF A(i,j)=1 AND MARK(j)=0 THEN十二十二.kj;DFS1(A,V,MARK,n,k)十三十三.十四十四.RETURN 5.3 图的遍历图的遍历一一.深度优先搜索遍历深度优先搜
21、索遍历二二.1.深度优先遍历的递归算法深度优先遍历的递归算法三三.若以邻接表表示图。若以邻接表表示图。邻接表:邻接表:四四.例如图:例如图:V LINK 五五.若定义顶点存储结点空间为若定义顶点存储结点空间为 V(1:n)和和LINK(1:n),六六.边结点存储空间为边结点存储空间为 NUM(1:2m)和和 NEXT(1:2m),七七.(有向图为有向图为LINK(1:n),NUM(1:m)m 边数,边数,n 顶点顶点数,数,八八.访问标记数组访问标记数组 MARK(1:n).ABCDEFG 1 2 3 456 71A2B3C4D5E6F7G21112223370707060505406405.
22、3 图的遍历图的遍历一一.深度优先搜索遍历深度优先搜索遍历二二.1.深度优先遍历的递归算法深度优先遍历的递归算法三三.设以设以i为初始顶点为初始顶点,深度优先搜索遍历算法深度优先搜索遍历算法(省去输入、输省去输入、输出说明出说明)四四.PROCEDURE DFS2(V,LINK,NUM,NEXT,n,i)五五.PROCESS (V(i)六六.MARK(i)1七七.P LINK(i)取取Vi的邻接表表头指针的邻接表表头指针i八八.WHILE p0 DO 依次搜索依次搜索Vi的每个邻接点的每个邻接点九九.j NUM(p)取邻接点顶点号取邻接点顶点号十十.IF MARK(j)=0 THEN十一十一.
23、DFS2(V,LINK,NUM,NEXT,n,j)从未访问过的从未访问过的Vj出发出发遍历遍历十二十二.P NEXT(p)取取Vi的下一邻接点的下一邻接点十三十三.十四十四.RETURN5.3 图的遍历图的遍历一、深度优先搜索遍历一、深度优先搜索遍历1.深度优先遍历的递归算法深度优先遍历的递归算法 如果是带权图,算法如果是带权图,算法 DFS1 中,对顶点中,对顶点vi的邻接点的搜索条件的邻接点的搜索条件 应修改为:应修改为:A(i,j)0 AND A(i,j)AND MARK(j)=0 以上算法的前提:连通图。以上算法的前提:连通图。若是非连通图,只要以图中每一个未访问过的顶点为初始顶点若是
24、非连通图,只要以图中每一个未访问过的顶点为初始顶点 调用调用 DFS1 或或 DFS2 即可。即可。例如:例如:FOR i=1 TO n DO IF MARK(i)=0 THEN CALL DFS1(A,V,MARK,n,i)即可对邻接矩阵表示的非连通图进行深度优先搜索遍历。即可对邻接矩阵表示的非连通图进行深度优先搜索遍历。其余类推。其余类推。思考:算法思考:算法DFS1、DFS2的的C语言描述语言描述?5.3 图的遍历图的遍历 一、深度优先搜索遍历一、深度优先搜索遍历 2.深度优先遍历的非递归算法深度优先遍历的非递归算法 基本思想:基本思想:设置一个栈,用以记录刚访问过的顶点设置一个栈,用以
25、记录刚访问过的顶点 i 的边结点的边结点(邻接点邻接点);从被访问过的邻接点返回到顶点从被访问过的邻接点返回到顶点i 时,从栈顶弹出一个边接时,从栈顶弹出一个边接 点点(邻接点邻接点);然后从刚出栈的边结点然后从刚出栈的边结点(邻接点邻接点)出发沿单链表出发沿单链表(矩阵第矩阵第i 行行)找找 到下一个邻接点进行处理。到下一个邻接点进行处理。具体的算法描述,不同的存储方式会有所不同。具体的算法描述,不同的存储方式会有所不同。以下为邻接矩阵和邻接表存储方式下算法的基本思路。以下为邻接矩阵和邻接表存储方式下算法的基本思路。5.3 图的遍历图的遍历一、深度优先搜索遍历一、深度优先搜索遍历 2.深度优
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 清华大学 朱明方 数据结构
限制150内