810 likes | 950 Views
图 Graph. 2010 赛前知识点. 图的定义 (Graph ). 比较: 线性表:数据间关系是线性的,每个元素只有一个前趋,一个后续 树:有着明显的层次关系,每个元素只有一个前趋,但有多个后续 图:数据之间的关系是任意,每个元素的前趋和后续个数是不定,图是一种较为复杂的非线性数据结构. 图的相关概念 图的存储表示 图的遍历 最小生成树 两点之间的最短路径问题 拓扑排序关键路径. 名词和术语. 网、子图. 完全图 、 稀疏图、稠密图. 邻接点、度、入度、出度. 路径、路径长度、简单路径 、 简单回路. 连通图、连通分量、 强连通图、强连通分量.
E N D
图Graph 2010赛前知识点
图的定义(Graph ) • 比较: • 线性表:数据间关系是线性的,每个元素只有一个前趋,一个后续 • 树:有着明显的层次关系,每个元素只有一个前趋,但有多个后续 • 图:数据之间的关系是任意,每个元素的前趋和后续个数是不定,图是一种较为复杂的非线性数据结构
图的相关概念 • 图的存储表示 • 图的遍历 • 最小生成树 • 两点之间的最短路径问题 • 拓扑排序关键路径
名词和术语 网、子图 完全图、稀疏图、稠密图 邻接点、度、入度、出度 路径、路径长度、简单路径、简单回路 连通图、连通分量、 强连通图、强连通分量 生成树、生成森林
一、 图的基本概念 1、图的的定义 图是由顶点V的集合和边E的集合组成的二元组: 记G=(V,E)
2、无向图和有向图 ⑴无向图Undigraph: 在图G=(V,E)中,如果对于任意的a,b∈V,当(a,b)∈E时,必有(b,a)∈E(即关系R对称),对称此图为无向图。在一无向图中用不带箭头的边 V={V1,V2,V3,V4,V5} E={(V1,V2),(V2,V3),(V3,V4),(V4,V5),(V5,V1),(V2,V5),(V4,V1)}
⑵有向图Digraph: 如果对于任意的a,b∈V,当(a,b)∈E时 ,(b,a)∈E未必成立,则称此图为有向图。 在有向图中,通常用带箭头的边连接两个有关联的结点。 V={V1,V2,V3,V4} E={<V1,V2>,<V2,V4>,<V1,V3>,<V3,V4>,<V4,V1>} 有向图中的边又称为弧。起点称为弧头、终点称为弧尾。
A B E C F A B E C A 弧或边带权的图分别称作有向网或无向网。 9 15 11 7 21 3 2 B 设图G=(V,{VR}) 和图G=(V,{VR}), 且VV, VRVR, 则称G 为 G 的子图。
B C D A E F 假若顶点v 和顶点w 之间存在一条边, 则称顶点v和w互为邻接点, 边(v,w)和顶点v 和w相关联。 和顶点v 关联的边的数目定义为边的度。 例如: 右侧图中 ID(B) = 3 ID(A) = 2
对有向图来说, A B E C F 由于弧有方向性,则有入度和出度之分 顶点的出度: 以顶点v 为弧尾的弧的数目; 顶点的入度: 以顶点v为弧头的弧的数目。 例如: OD(B) = 1 顶点的度(TD)= 出度(OD)+入度(ID) ID(B) = 2 TD(B) = 3
A B E C F 设图G=(V,{VR})中的一个顶点序列 { u=vi,0,vi,1, …, vi,m=w}中,(vi,j-1,vi,j)VR 1≤j≤m, 则称从顶点u 到顶点w 之间存在一条路径。 路径上边的数目称作路径长度。 如:从A到F长度为 3 的路径{A,B,C,F} 简单路径:指序列中顶点不重复出现的路径。 简单回路:指序列中第一个顶点和最后一个顶点相同的路径。
C B D A E F C B D A E F 若图G中任意两个顶点之间都有路径相通,则称此图为连通图; 若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量。
A A B E B E C F C F 对有向图, 若任意两个顶点之间都存在一条有向路径,则称此有向图为强连通图。 否则,其各个强连通子图称作它的强连通分量。
C B D A E F 假设一个连通图有 n 个顶点和 e 条边,其中 n-1 条边和 n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。 对非连通图,则称由各个连通分量的生成树的集合为此非连通图的生成森林。
相邻:若两个结点U、V之间有一条边连接, U、V互为邻接点,称这两个结点U、V是关联的。 带权图:两点间不仅有连接关系,还标明了数量关系(距离、费用、时间等)。 图的阶:图中结点的个数。 结点的度:无向图:与顶点关联的边的数目。 有向图:等于该顶点的入度与出度之和。 入度:在有向图中,把以结点V为终点的边的数目称为V的入度; 出度:在有向图中,把以结点U为起点的边的数目称为U的出度; 奇点:度数为奇数的结点; 偶点:度数为偶数的结点; 终端结点:在有向图中,出度为0的结点; 定理1:无向图中所有顶点的度之和等于边数的2倍,有向图中的所有顶点的入度之和等于所有顶点的出度之和; 定理2:任意一个图一定有偶数个奇点;
简单路径和回路 路(径):从一个结点出发,沿着某些边连续地移动而到达另一个指定的结点,这种依次由结点和边组成的序列,叫“路”或者“路径”。 路径长度:路径上边的数目。 起点Vp和终点Vq相同的路径称为环或回路 若一条路径上除了起点Vp和终点Vq可以相同外,其余顶点均不相同,则称此路径为一条简单路径。起点Vp和终点Vq相同的简单路径称为简单回路或简单环。 图(a)中v1→v2→v3是一条简单路径,v1→v3→v4→v1→v3不是简单路径。
C B D A E F 连通:如果图中结点U,V之间存在一条从U通过若干条边、点到达V的通路,称U、V是连通的。 连通图:如果一个无向图中,任一对不同顶点U、V,都有一条(U,V)通路,则称图G是连通的。 强连通图:在有向图G中,每一对结点之间都有路径的图。 网络:带权的连通图。
基本术语 完全图、稀疏图与稠密图 无向图其边数e的取值范围是0~n(n-1)/2。 无向完全图:有n(n-1)/2条边的无向图。 有向图其边数e的取值范围是0~n(n-1)。 有向完全图:有n(n-1)条边的有向图。 稀疏图:对于有很少条边的图(e<nlogn), 反之称为稠密图。 若无向图中任意两个顶点之间都存在着一条边,有向图中的任意两个顶点之间都存在着方向相反的两条边,则称此图为完全图。 N阶完全有向图含有n*(n-1)条边,n阶完全无向图含有n*(n-1)/2条边。即完全图具有最多的边数。任意一对顶点间均有边相连。
图 ⑴、 ⑵图的各顶点的度见下表: 入度( indegree):有向图中把以顶点 v为终点的边的条数称为是顶点 v的入度。 出度( outdegree):有向图中把以顶点 v为起点的边的条数称为是顶点 v的出度。⑵图各顶点的入度和出度见下表 (各顶点的入度与出度之和为该顶点的度 )
图的存储表示 图的数组(邻接矩阵)存储表示 图的邻接表存储表示
0 (i,j)VR Aij={ 1 (i,j)VR B C A D F E 一、图的数组(邻接矩阵)存储表示 定义:矩阵的元素为
A B E C F 有向图的邻接矩阵为非对称矩阵
带权图的邻接矩阵可以定义为: 2邻接矩阵表示为
B C A D A 1 4 B 0 4 5 C 3 5 D 2 5 E 0 1 F 1 2 3 0 1 2 3 4 5 F E 二、图的邻接表 存储表示
A B E A B C D E 0 1 2 3 4 1 4 C F 2 3 0 1 2 有向图的邻接表 可见,在有向图的邻接表中不易找到指向该顶点的弧
A B E C D A B C D E 3 0 1 2 3 4 3 0 4 2 0 有向图的逆邻接表 在有向图的邻接表中,对每个顶点,链接的是指向该顶点的弧
图的遍历 从图中某个顶点出发游历图,访遍 图中其余顶点,并且使图中的每个顶点 仅被访问一次的过程。 深度优先搜索 广度优先搜索 遍历应用举例
图的遍历 1、概念:从图中某一结点出发系统地访问图中所有结点,使每个结点恰好被访问一次,这种运算 称图的遍历。 2、遍历图的基本搜索方法有两种:深度优先搜索DFS(Depth First Search)和广度优先搜索BFS(Broad First Search)。这两种方法都适用于有向图和无向图。 图的遍历算法设计需要考虑3个问题: (1)图的特点没有首尾之分,所以算法的参考要指定访问的第一个顶点。 (2)对图的遍历路径有可能构成一个回路,从而造成死循环,所以算法设计要考虑遍历路径可能的回路问题。 (3)一个顶点可能和若干个顶点都是相邻顶点,要使一个顶点的所有相邻顶点按照某种次序被访问。
V w1 w3 w2 SG3 SG1 SG2 W1、W2和W3均为 V 的邻接点,SG1、SG2 和 SG3 分别为含顶点W1、W2和W3的子图。 访问顶点 V ; for (W1、W2、W3 ) 若该邻接点W未被访问, 则从它出发进行深度优先搜索遍历。
从上页的图解可见: 1. 从深度优先搜索遍历连通图的过程类似于树的先根遍历; 2. 如何判别V的邻接点是否被访问? 解决的办法是:为每个顶点设立一个 “访问标志 visited[w]”;
非连通图的深度优先搜索遍历 首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。
0 1 6 a b g 3 4 5 2 c d e f 7 8 h k 0 1 2 3 4 5 6 7 8 F F F F F F F F F 例如: a c a b g h c d e f d k h k f e 访问标志: T T T T T T T T T a c h d k f e b g 访问次序:
w2 w1 V w3 w7 w8 w4 w6 w5 二、广度优先搜索遍历图 对连通图,从起始点V到其余各顶点必定存在路径。 w2 w1 其中,V->w1, V->w2, V->w8 的路径长度为1; V w3 w7 V->w7, V->w3, V->w5 的路径长度为2; w8 w4 w6 V->w6, V->w4 的路径长度为3。 w5
从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。 若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
遍历应用举例 1. 求一条从顶点 i 到顶点 s 的 简单路径 2.求两个顶点之间的一条路径 长度最短的路径
g b a c d e f h k 1.求一条从顶点 i 到顶点 s 的简单路径 求从顶点 b 到顶点 k 的一条简单路径。 例如: 从顶点 b出发进行深度优先搜索遍历 假设找到的第一个邻接点是c,则得到的结点访问序列为: bc h d a ek f g 假设找到的第一个邻接点是a,且得到的结点访问序列为: ba d h c ek f g
图的生成树 生成树的定义 若从图的某顶点出发,可以系统地访问到图中所有顶点,则遍历时经过的边和图的所有顶点所构成的子图,称作该图的生成树。(此定义不仅仅适用于无向图,对有向图同样适用。)(1)若G是强连通的有向图,则从其中任一顶点v出发,都可以访问遍G中的所有顶点,从而得到以v为根的生成树。(2)若G是有根的有向图,设根为v,则从根v出发可以完成对G的遍历,得到G的以v为根的生成树。
(连通网的)最小生成树 问题: 假设要在 n 个城市之间建立通讯联络网,则连通 n 个城市只需要修建 n-1条线路,如何在最节省经费的前提下建立这个通讯网?
该问题等价于: 构造网的一棵最小生成树,即: 在 e 条带权的边中选取 n-1 条边(不构成回路),使“权值之和”为最小。 算法一:(普里姆算法) 算法二:(克鲁斯卡尔算法)
普里姆算法的基本思想: 取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w。在添加的顶点 w 和已经在生成树上的顶点v 之间必定存在一条边,并且该边的权值在所有连通顶点 v 和 w 之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上含有 n-1 个顶点为止。
19 a b 5 12 14 c 7 18 e 8 16 3 g d 21 27 f 例如: a b 5 14 c e 8 16 3 g d 21 f 所得生成树权值和 = 14+8+3+5+16+21 = 67
V-U U 一般情况下所添加的顶点应满足下列条件: 在生成树的构造过程中,图中 n 个顶点分属两个集合:已落在生成树上的顶点集 U和尚未落在生成树上的顶点集V-U,则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。