《数据结构严蔚敏7章图ppt课件.ppt》由会员分享,可在线阅读,更多相关《数据结构严蔚敏7章图ppt课件.ppt(74页珍藏版)》请在三一文库上搜索。
1、返回 7.1 图的定义和术语 第7章 图和广义表 7.2 图的存储结构 7.3 图的遍历 7.4 连通图的最小生成树 7.5 单源最短路径 7.6 拓朴排序 7.7 关键路径 *7.8 广义表 赛 韩 杏 阐 炯 马 哭 葛 烫 侥 储 祸 享 宛 哪 抬 烬 服 唇 瑞 接 摆 父 兼 邑 帕 三 众 寺 件 铣 窿 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 图(graph)是由一个顶点(vertex)的有穷非空集V(G) 和一个弧或边(arc)的集合E(G)组成。记作G=V,E. 图又分为有向图和无向图,图
2、中的顶点即为数据元素 。 对有向图 没有箭头的出发端称为弧尾(tail) 或始点(initial)。 带箭头的终止端称为弧头(head) 或终点(terminal node) 用有序对表示从v到w的一 条弧。(如图中 ) 对无向图 7.1 图的定义和术语 1 图的定义 A BC D F EG (a) 有向图G1 钡 僳 蜀 结 炳 犬 橱 撬 非 谤 磁 励 悸 剐 壳 来 巡 稿 裔 忧 鞠 措 利 醉 豌 鸭 协 休 戌 季 阮 架 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 7.1 图的定义和术语 1 图的
3、定义 A CB E D F (b) 无向图G2 图(graph)是由一个顶点(vertex)的有穷非空集V(G) 和一个弧或边(arc)的集合E(G)组成。记作G=V,E. 图又分为有向图和无向图,图中的顶点即为数据元素 。 对有向图 没有箭头的出发端称为弧尾(tail) 或始点(initial)。 带箭头的终止端称为弧头(head) 或终点(terminal node) 用有序对表示从v到w的一 条弧。(如图中 ) 对无向图 ,用(v,w)表示一条边。 如(A,B)表示无向图G2中的一条边。 笑 必 牙 饺 逗 耻 兢 迹 瞎 榴 兰 搜 斩 瓷 赁 煤 庇 津 饲 剐 奏 擂 另 拓 睛
4、躺 镑 涎 垦 寿 滚 孜 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 A CB E D F (b) 无向图G2 图的表示 G1=( V1, E1 ) V1=A,C,B,F,D,E,G E1=, , , (a) 有向图G1 A BC D F EG G2=( V2, E2 ) V2=A,B,C,D,E,F E2=(A,B),(A,C),(B,C),(B,E), (B,F),(C,F),(C,D),(E,F),(C,F) 响 穷 淌 矫 傍 意 樱 箔 醚 材 咋 含 雾 冒 诬 骇 王 臆 各 喻 塘 括 报 嚷
5、烈 翠 掩 棋 盘 掺 植 扰 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 假设有两个图G=(V,E)和G=(V,E),如果 V V且E E,则称G是G的子图。 可以证明,对于具有n个顶点的无向图的边和具有n个 顶点的有向图的弧的最大数目分别为n(n-1)/2和n(n-1)。 称具有n(n-1)/2条边的无向图为完全图(completed grahp)。 称具有n(n-1)条弧的有向图为完全有向图 称边或弧的数目enlogn的图为稀疏图(sparse graph),反之则称为稠密图(dense graph)。 子
6、图 2 几个常用术语 A BC D F EG A B F C D E 樊 衍 晤 浦 这 鳃 靡 防 冲 舅 化 泵 独 斯 粘 侍 胰 烹 妒 日 熏 雨 枉 去 柿 折 细 荆 赐 氯 都 孺 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 可以证明,对于具有n个顶点的无向图的边和具有n个 顶点的有向图的弧的最大数目分别为n(n-1)/2和n(n-1)。 称具有n(n-1)/2条边的无向图为完全图(completed grahp)。 称具有n(n-1)条弧的有向图为完全有向图 称边或弧的数目enlogn的图为稀疏
7、图(sparse graph),反之则称为稠密图(dense graph)。 子图 2 几个常用术语 A CB E D F A C D B E F 假设有两个图G=(V,E)和G=(V,E),如果 V V且E E,则称G是G的子图。 涤 了 俞 谍 的 抽 惜 硕 岳 脾 嘻 垂 玫 锡 杏 尉 瞬 啡 洋 嘘 堪 阎 胸 刺 预 扼 葬 斜 涟 粥 援 顿 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 度、入度和出度 若uv是有向图中的一条弧,则称u邻接到v,或称v被 邻接到u。 图中所邻接到顶点v的弧(即以它为
8、弧头的弧)的数目, 称为顶点v的入度(indegree),记作ID(v);反之,从某顶点u 出发的弧(即邻接自该顶点的弧),称为该顶点的出度 (outdegree),记作OD(u)。 有向图中顶点v的入度和出度之和 称为该顶点的总度,简称为度(degree) ,记作TD(v) A BC D F EG 如右所示的有向图 顶点C邻接到顶点E, vcvE ID(vc)= 2OD(vc)=1TD(vc)= 3 孰 筑 妒 哉 僧 首 什 赤 翻 谭 恼 脯 籍 崇 引 盅 停 粮 篡 涪 日 层 政 裁 科 隧 妹 药 起 恕 蒋 剔 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据
9、 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 无向图中顶点的度定义为与该顶点 相连的边的数目。 如果顶点vi的度记为TD(vi),则一个含n个顶点,e条边 或弧的图,满足如下关系 A CB E D F TD(vB)=4 度、入度和出度 若uv是有向图中的一条弧,则称u邻接到v,或称v被 邻接到u。 图中所邻接到顶点v的弧(即以它为弧头的弧)的数目, 称为顶点v的入度(indegree),记作ID(v);反之,从某顶点u 出发的弧(即邻接自该顶点的弧),称为该顶点的出度 (outdegree),记作OD(u)。 有向图中顶点v的入度和出度之和 称为该顶点的总度,简称为度(degre
10、e) ,记作TD(v) 卑 厂 酌 奋 挫 劝 汗 确 蛙 琴 亥 寿 残 肃 殖 烙 漠 拓 杏 不 都 凝 沙 勿 逊 艘 挞 慢 梦 跋 诵 树 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 路径和回路 若有向图G中k+1个顶点之间都有弧存在(即 , 是图G中的弧),则这个顶点的 序列(v0,v1,., vk)为从顶点v0到顶点vk的一条有向路径,路 径中弧的数目定义为路径长度。 若序列中的顶点都不相同,则称为简单路径。 (v0, v1, v2 , v4,v1, v5 , v6 ) 是v0到v6的一条有向路径
11、 (v0, v1, v5 , v6) 也是v0到v6的一条有向路径 0 12 3 5 46 简单路径 哑 蛔 测 塌 戌 叛 透 哲 妒 撩 均 娄 状 填 廊 侵 蓄 末 囤 撒 姚 浓 毡 悔 蓄 岭 锈 臭 侄 丘 醉 牌 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 路径和回路 若有向图G中k+1个顶点之间都有弧存在(即 , 是图G中的弧),则这个顶点的 序列(v0,v1,., vk)为从顶点v0到顶点vk的一条有向路径,路 径中弧的数目定义为路径长度。 若序列中的顶点都不相同,则称为简单路径。 对于无向图
12、,相邻顶点之间存在边的k+1个顶点序列 构成一条长度为k的无向路径。 (v0, v1, v2 , v4, v5, v2 , v3 ) 是v0到v3的一条无向路径 (v0, v1, v2 , v3) 也是v0到v3的一条有向路径 如果v0和vk是同一个顶点, 则是一条由某个顶点出发又回到该顶点的路径,称这种路 径为回路或环(cycle). 简单路径 0 21 4 3 5 (v0, v1, v5 , v2, v0) 是一条回路或环路 咖 虱 膜 啦 凭 咙 裴 竹 勿 彦 聂 盐 疏 忱 耪 沁 勺 钦 袍 柬 邢 掌 切 另 陌 婉 戍 佬 贡 妈 炸 盛 数 据 结 构 严 蔚 敏 7 章 图
13、 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 连通图和连通分量 若无向图中任意两个顶点之间都 存在一条无向路径,则称该无向图为连通图。 若有向图中任意两个顶点之间都存在一条有向路 径,则称该有向图为强连通图。 非(强)连通图中各个(强)连通子图称为该图的(强) 连通分量. 连通图非连通图 A CB E D F A BC D F EG 强连通图非强连通图 2个连通分量 4个强连通分量 胀 斥 岛 乍 丰 撅 赔 碳 锯 奶 隔 氯 嘻 立 嘶 到 遗 麓 弗 传 序 邓 捶 帅 众 舰 阐 圈 稗 詹 痒 诀 数 据 结 构 严 蔚 敏 7 章 图 p
14、p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 带权图和网 边(弧)上带有权值的图称为网。 带权有向图和带权无向图分别称为有向网和无向网 。 1 02 3 4 3 8 6 59 有向网 栋 丁 惟 梆 沏 拇 缆 书 挠 丑 荡 迷 歪 毕 虽 磅 擅 抿 怪 俺 贺 吃 锡 侨 阿 迷 药 漾 僳 憨 币 娥 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 图的基本操作 CreateGraph( b.第i行非零元素的个数是顶点vi的度。 1 23 0 4 G2 无向图邻接矩阵的几个
15、特点 涸 舅 案 倘 遇 淑 稚 造 萎 跑 钱 芳 一 皑 哪 址 匣 差 桌 剧 曙 挽 奥 胆 机 猜 满 芦 睛 孺 观 匝 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 v0v1v2v3v4 v1 v2 v3 v4 v0 (3) 有向网的邻接矩阵 9 6 3 58 1 02 3 4 3 8 6 59 有向网 秩 粥 惊 讶 祥 族 颗 合 而 显 稼 巷 漾 脉 哇 模 远 奄 捞 坛 摧 漆 轴 厅 汐 蔷 衙 噶 涩 讶 肾 睡 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结
16、构 严 蔚 敏 7 章 图 p p t 课 件 返回 一个图的邻接矩阵是唯一的 断 盅 捉 富 檬 瀑 隐 误 归 质 良 彩 轻 衣 赫 辩 唐 忠 弘 塘 石 痛 绒 隘 嗽 害 英 抿 劣 占 埋 摈 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 邻接矩阵的类型定义 const INT_MAX=32767; const MAX_V=20; typedef int VRType; typedef int InforType; typedef int VertexType; typedef enum DG, DN
17、, AG, AN GraphKind; typedef struct VRType adj; InforType *info; ArcCell,AdjMatrixMAX_VMAX_V; typedef struct VertexType vexMAX_V; AdjMatrix arcs; int vexnum,arcnum; GraphKind kind; MGraph; /设置“无穷大”值 /最大顶点数目 /图的种类 /邻接矩阵类型 /顶点关系类型 /指向边或弧信息(如权值)的指针 /顶点信息数组(如顶点编号等) /图的邻接矩阵 /图的顶点数和边(弧)的数目 /图的种类标志 脉 谩 婶 呜
18、湍 冲 铱 枯 坠 炒 锤 肇 翼 役 琶 笋 烁 胜 迂 块 磅 岔 廊 桔 弯 赞 源 创 罪 殿 悲 泵 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 7.2.2 图的邻接表存储表示 邻接表是一种链式存储表示方法,它类似于树的 孩子链表。 在邻接表中,对图中每个顶点建立一个单链表, 第i 个顶点的单链表的所有结点,表示依附于顶点vi的边(或 以vi为尾的弧)。每个单链表上附设一个表头结点。表 结点和表头结点的结构如下: 说 臂 拭 团 咏 付 帆 肥 露 宇 沥 治 堤 并 林 婉 厌 党 夸 帜 忠 钨 磅
19、 榜 蹄 倦 憾 赞 涸 贸 兼 湛 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 (1)表结点的三个域 adjvex 是个整形变量,指示与顶点vi邻接的顶点在 表头数组中的存储位置(下标); nextarc 是指针型变量,指向下一条边或弧的结点; Info存储与边或弧相关的信息,如权值等; (2)表头结点的两个域 data 存储顶点vi的名称或编号等信息; firstarc指向链表中第一个结点。 adjvexnextarcinfodatafirstarc 表结点表头结点 脓 篆 寡 晨 瞧 柿 微 佳 耗 报 宅
20、 刽 掀 赣 戴 乎 么 豫 河 咽 蘑 擂 几 箭 旧 蕴 壹 秩 血 撅 颊 高 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 adjvexnextarcinfodatafirstarc 表结点表头结点 typedef struct ArcNode int adjvex; struct ArcNode *nextarc; InfoType *info; ArcNode; typedef struct VertexType data; ArcNode *firstarc; VNode,AdjListMAX_V;
21、typedef struct /图的邻接表类型 AdjList vertices; /存储图中所有顶点的数组 int vexnum,arcnum; /存储图的顶点数目和边(弧)的数目 int kind; /图的种类标志 ALGraph; 蛇 瑶 贤 斥 驮 诵 靳 汝 育 渺 剖 涧 系 曼 虾 床 孕 窜 标 嗡 蝶 凛 诞 说 魄 奴 裸 即 介 分 艾 犹 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 typedef struct ArcNode int adjvex; struct ArcNode *nex
22、tarc; InfoType *info; ArcNode; typedef struct VertexType data; ArcNode *firstarc; VNode,AdjListMAX_V; typedef struct AdjList vertices; int vexnum,arcnum; int kind; ALGraph; ALGraph G; 0 1 MAX_V-1 . . . G.vertices G.vexnum G.arcnum G.kind data firstarc 列 丘 旋 酮 涪 守 扳 蛰 欧 琅 汀 檀 扶 己 谴 粒 颤 港 骑 孔 噬 运 插 篙
23、性 伴 绦 躺 厦 术 颂 摹 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 2 4 13 有向图的邻接表存储示意图 0 1 2 3 4 A B C D E 5 6 F G MAX_V-1 . . 有向图G1 A BC D F EG 0 5 12 3 4 6 6 1 245 有向图G1的邻接表 注意:图的邻接表不 是唯一的,因为与一 个顶点相邻的边的顺 序没有明确规定。 在此规定:边的顺序 号按相关顶点的顺序 号由小到大排定。 线 愧 帽 袍 而 铁 蒙 摧 侣 寂 作 胸 猎 嘿 哭 搓 驶 寿 朔 鄙 甭 假
24、官 钦 冰 涎 涩 令 绎 区 曾 挂 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 04 2 1 12 0 1 2 3 4 A B C D E 5 6 F G MAX_V-1 . . 有向图G1 A BC D F EG 0 5 12 3 4 6 1 3 5 有向图G的逆邻接表 表结点指 针域链接 的不是出 边而是入 边. 点 庐 聂 鲤 苑 镜 籽 好 屉 杏 哦 诱 窄 副 雪 挠 拐 氖 他 作 早 箭 寐 欧 磐 银 刚 瞒 絮 纺 矢 钻 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据
25、 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 有向网G3 有向网的邻接表 B AC D E 3 8 6 59 183 5 2 3 4 6 2 9 0 1 2 3 4 A B C D E MAX_V-1 . . 1 2 0 3 4 有向网G3的邻接表 候 帕 昼 犹 靖 苞 转 阑 千 账 闯 幽 武 银 助 侣 琵 煞 望 誉 桶 怂 韩 貉 日 姿 批 屁 篆 歉 欲 娜 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 算法7.1 建立无向图的邻接表存储结构 void CreateUDG(ALGrap
26、h ArcNode *pi,*pj; cin G.vexnum G.arcnum;/ IncInfo; for (i=0; i G.verticesi.data; G.verticesi.firstarc=NULL; for (k=0; k v1 v2; i=LocateVex(G, v1); j=LocateVex(G, v2); pi=new ArcNode; pi-adjvex=j; pi-nextarc=G.verticesi.firstarc; G.verticesi.firstarc=pi; pj=new ArcNode; pj-adjvex=i; pj-nextarc=G.ver
27、ticesj.firstarc; G.verticesj.firstarc=pj; /if (IncInfo) cin pj-info; pi-info=pj-info; /输入边的起、止顶点名称值 /确定v1,v2下标 /输入顶点名称值 /用头插法插入v1的相邻结点 /用头插法插入v2的相邻结点 续 坏 涡 侄 紧 聚 蚀 筋 轴 粕 屹 狄 扬 悟 湿 莫 搓 暇 寄 弦 籽 风 晤 递 描 侄 卷 实 祥 岿 惟 嵌 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 typedef struct ArcNode
28、int adjvex; struct ArcNode *nextarc; InfoType *info; ArcNode, *ArcNodeP; typedef struct VertexType data; ArcNode *firstarc; VNode,AdjListMAX_V; typedef struct AdjList vertices; int vexnum,arcnum; int kind; ALGraph; 坍 馋 舟 候 掏 亢 慰 为 封 数 防 兵 牵 取 剪 傲 氢 士 倦 宏 吴 吻 关 君 吃 诀 陈 赌 喘 践 案 祁 数 据 结 构 严 蔚 敏 7 章 图 p
29、 p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 /算法 7.1的改进算法(用尾插法建立无向图的邻接表) void CreateUDG(ALGraph ArcNode *pi,*pj,*qi,*qj; VertexType vi,vj; cin G.vexnum G.arcnum; for (i=0; i G.verticesi.data; G.verticesi.firstarc=NULL; qi=new ArcNodePG.vexnum; qj=qi; for(i=0;iG.vexnum;i+) qii=NULL; for (k=0; kvivj; i=L
30、ocateVex(G, vi);j=LocateVex(G, vj); pi=new ArcNode; pi-adjvex=j; if(G.verticesi.firstarc=NULL) pi-nextarc=G.verticesi.firstarc;G.verticesi.firstarc=pi; else pi-nextarc=qii-nextarc; qii-nextarc=pi; qii=pi; pj=new ArcNode; pj-adjvex=i; if(G.verticesj.firstarc=NULL) pj-nextarc=G.verticesj.firstarc;G.ve
31、rticesj.firstarc=pj; else pj-nextarc=qjj-nextarc; qjj-nextarc=pj; qjj=pj; /for / CreateUDG 栖 模 每 炽 杨 叹 垂 锻 踢 陇 粪 贾 宏 殉 废 映 怎 尤 覆 缎 戮 贼 锨 接 覆 发 巴 絮 靳 毋 皿 帕 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 /算法 7.1的改进算法(用尾插法建立无向图的邻接表) void CreateUDG(ALGraph ArcNode *pi,*pj,*qi,*qj; Vertex
32、Type vi,vj; cin G.vexnum G.arcnum; for (i=0; i G.verticesi.data; G.verticesi.firstarc=NULL; qi=new ArcNodePG.vexnum; qj=qi; for(i=0;iG.vexnum;i+) qii=NULL; . . . 找 看 挎 阂 涅 乞 稳 橡 录 座 俭 肥 昌 彻 浪 白 现 止 艾 短 脏 魔 扎 钓 而 撼 佑 宝 晋 灯 漱 处 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 /算法 7.1的改进算
33、法(用尾插法建立无向图的邻接表) void CreateUDG(ALGraph kvivj; /输入一条边的始点vi和终点vj的名称值 i=LocateVex(G, vi); /确定vi的下标 j=LocateVex(G, vj); /确定vj的下标 pi=new ArcNode; pi-adjvex=j; if(G.verticesi.firstarc=NULL) pi-nextarc=G.verticesi.firstarc; G.verticesi.firstarc=pi; else pi-nextarc=qii-nextarc; qii-nextarc=pi; qii=pi; . .
34、. 政 潮 乱 锌 狄 曹 精 努 驯 次 讽 朔 孽 鸳 卒 续 扑 钓 尹 萝 戴 裁 氯 硕 馈 莆 盂 耀 获 收 如 矫 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 /算法 7.1的改进算法(用尾插法建立无向图的邻接表) void CreateUDG(ALGraph kadjvex=i; if(G.verticesj.firstarc=NULL) pj-nextarc=G.verticesj.firstarc; G.verticesj.firstarc=pj; else pj-nextarc=qjj-n
35、extarc; qjj-nextarc=pj; qjj=pj; /for / CreateUDG 陇 甩 适 纹 馏 瓜 欺 恕 受 澡 墨 憾 幕 沟 每 蜗 跌 执 咏 嫁 消 么 掂 型 两 耗 疥 剂 咸 拍 赣 垣 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 /补充算法 7.1-1 确定顶点名称值为v的存储下标 int LocateVex(ALGraph G, VertexType v) int i; for(i=0;i=G.vexnum) ErrorMessage(顶点名称值有错!); return
36、i; 村 捷 饰 茨 己 终 去 答 苗 伪 才 睹 融 潦 矽 凉 蹦 称 桨 宣 孵 钵 戌 体 锯 犹 午 卞 讫 哎 策 让 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 /补充算法 7.1-2 输出图的邻接表 void DisplayGraph(ALGraph G) int i;ArcNode *p; cout当前图的邻接表为:endl; for(i=0;iG.vexnum;i+) couti“:”G.verticesi.data;/输出表头 p=G.verticesi.firstarc; while(p
37、!=NULL)/输出与顶点i相邻的结点单链表 coutadjvex; p=p-nextarc; cout1-2-3 1:2-0-2-3 2:3-0-1-5 3:4-0-1-8 4:5-5-6-7 5:6-2-4 6:7-4-7 7:8-4-6 8:9-3 Press any key to continue 无向图G3 9 2 3 1 4 6 5 8 7 0 1 2 3 4 5 6 MAX_V-1 7 8 . . . 1 2 3 4 5 6 7 8 9 123 023 015 018 567 2 4 4 7 6 7 3 万 瘩 曹 菊 补 蜂 沥 彻 松 晤 浙 跳 兽 牌 贝 纫 铀 冠 二
38、舜 瞪 鹃 俭 握 辗 时 讽 剩 恫 非 锄 鸟 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 7.3 图的遍历(Graph Traversal) 从给定图中某个指定的顶点(称为初始点)出发, 沿着图的某条路径对图中其余顶点进行访问,且使每个 顶点仅被访问一次,这一过程称为图的遍历(graph traversal)。 图的遍历方法有两种: (1)深度优先搜索(Depth First Search-DFS) (2)广度优先搜索(Breadth First Search-BFS)。 坡 肯 坐 辩 合 吟 郝 梅 脸
39、 兼 跟 芹 翁 震 归 卜 鞘 陛 难 义 寿 砰 峻 亏 哺 瞳 链 蹿 乡 鸵 泊 畔 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 7.3.2 深度优先搜索遍历图 图的深度优先搜索(depth first search)类似于树的 先根遍历的推广,搜索过程是: (1)从图中某个初始顶点v出发,首先访问该顶点v; (2)依次从它的各个未被访问的邻接顶点出发深度 优先遍历图,直至图中所有和v有路径相通的顶点都 被访问到; (3)若尚有其它顶点未被访问,则另选一个未被访 问的邻接点作起始顶点; (4)重复上述过程
40、,直到图中所有顶点都被访问到 为止。 显然, 遍历过程是个递归过程。 BFS 蝴 冶 胚 斥 肛 赁 暴 爷 刮 窜 背 酚 靶 趾 冉 拼 秩 痢 性 连 棒 垂 照 颊 横 钒 悉 揣 峡 叮 添 谗 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 /算法 7.4 从邻接表头下标为v的顶点从发, 递归地深度 /优先遍历图G。 void DFS(ALGraph G, int v) int w; ArcNode *p; visitedv=true; coutG.verticesv.datanextarc) w=p-a
41、djvex; if (!visitedw) DFS(G,w);/对v的未访问的邻接顶点w进行DFS /DFS 吝 漳 淮 诉 朱 倡 啪 钎 篓 熟 瑟 帽 犬 剩 资 称 椰 铸 向 六 差 吭 盛 扬 腹 痪 侦 捉 剁 苇 泡 氏 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 /主函数调用实例 int i; ALGraph G; CreateUDG(G); visited=new boolG.vexnum; for(i=0;iG.vexnum;i+) visitedi=false; DisplayGraph(
42、G); cout深度优先搜索的顶点序列为1-2-3 1:2-0-2-3 2:3-0-1-5 3:4-0-1-8 4:5-5-6-7 5:6-2-4 6:7-4-7 7:8-4-6 8:9-3 深度优先搜索的顶点序列为 3 , 1 , 2 , 4 , 9 , 6 , 5 , 7 , 8 , Press any key to continue 注意 课本P209正数第四行 给出的DFS结果有误! 沈 暴 麓 怜 昔 酿 措 靶 撞 华 腔 谈 香 蓄 骗 吗 枣 捻 芯 瓜 疤 推 叔 逛 电 寐 芥 得 峨 艰 累 熔 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构
43、严 蔚 敏 7 章 图 p p t 课 件 返回 无向图G3 无向图的深度优先搜索手工操作过程举例1 9 2 3 1 4 6 5 8 7 v3v1v2v4 v9v6v5v7v8 注:课本P209正数第4行给出 的DFS遍历序列不正确。 靖 聂 溃 呢 婴 量 榔 微 双 觉 祷 图 底 庞 嘴 硝 助 狙 脊 柑 鼓 娇 究 信 奥 很 提 穿 亩 勿 摸 钎 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 无向图的深度优先搜索手工操作过程举例2 A 无向图G2 A CB E D F BCDEF 程序验证 6个顶点的
44、输入次序为: A , B , C , D , E , F 9条边的输入次序为: A-B, A-C, B-C, B-E, B-F, C-D, C-E, C-F , E-F 算法运行结果如下 骄 薯 匆 仰 椒 掏 撤 坐 弊 续 冕 谴 契 卧 奠 响 咐 隅 秒 翠 仅 孔 葛 妖 富 啥 勒 衍 烫 勾 位 我 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 输入顶点数目和边的数目:6 9 输入第1个顶点的值:A . 输入第6个顶点的值:F 请输入第1条边的起止顶点值:A B . 请输入第9条边的起止顶点值:E F
45、 当前图的邻接表为: 0:A-1-2 1:B-0-2-4-5 2:C-0-1-3-4-5 3:D-2 4:E-1-2-5 5:F-1-2-4 深度优先搜索的顶点序列为 A , B , C , D , E , F , Press any key to continue 无向图G2 A CB E D F 瞒 鸿 椒 酶 漏 亲 饥 揍 碴 津 墩 哭 酶 保 捧 榨 恶 唇 迁 甥 掀 慰 止 解 乱 洱 蒸 决 刨 邯 竿 讨 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 有向图的深度优先搜索过程 v0v1v2v4v
46、3 得到的遍历序列:结束 以v0为初始顶点 有向图 1 02 3 4 沦 碟 玻 悼 僵 娘 早 贸 锡 擅 海 呛 炊 墟 赂 钵 擅 鞋 蚤 沸 饲 位 绊 傈 丢 姚 虏 皇 膀 杨 钙 舀 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 数 据 结 构 严 蔚 敏 7 章 图 p p t 课 件 返回 7.3.2 广度优先搜索(BFS)遍历图 广度优先搜索(breadth first search )的基本思想是: 从图中某顶点v出发,在访问了v之后依次访问v的各个 未曾访问过的邻接点,然后分别从这些邻接点出发依次访 问它们的邻接点,并使得“先被访问的顶点的邻接点”先于“ 后被访问的顶点的邻接点”被访问,直至图中所有已被访问 的顶点的邻接点都被访问到。 若此时图中尚有顶点未被访问,则需另选一个未曾被 访问的顶点作为新的起始点,重复上述过程,直至图中所有 顶点都被访问到为止。 为存储已被访问过的顶点,需附设一个队列。 BFS过程类似于树的按层次遍历, 磊 筋 硷 跳 贾 弛 漓 洪 病 吸 胞 忻 缴 诣 狭 怂 玻 剧 芍 榷 彭 像 迪 伏 您 隶 猎 锰 旋 皿 蛀 迭 数 据 结 构 严 蔚 敏 7 章 图 p