回顾:数据的逻辑结构 图: G =(V,E) 无向图(Undirected graph): 每条边的没有方向,eg:G1 有向图(Directed graph): 每条边都有方向,eg:G2 完全图: 任意两个顶点都有一条边相连(有去有回) 稠密图: 有较多边或弧的图。 网: 边 / 弧带权值的图。 邻接: 有边 / 弧相连的两个顶点之间的关系。 关联(依附): 边 / 弧与顶点之间的关系。 顶点的度: 与该顶点相关联的边的数目,记为:TD(v) 那么,问:当有向图中仅1个顶点的入度为0,其余顶点的入度均为1,此时是什么形状?(答案:有向树,如下图) 连通图(强连通图): 在无(有)向图 G = ( V, {E} )中,对任意两个顶点v、u,都存在从 v 到 u 的路径,则称G是连通图(强连通图)。 子图: 设有两个图 G = ( V, {E} ) 和 G1 = ( V1, {E1} ),若 V1 包含于 V,E1 包含于 E,则称 G1 是 G 的子图。 首先回顾一下上边提到的邻接,什么是邻接 无向图 无向图 遍历定义: 遍历实质: 找每个顶点的邻接点的过程。 图的特点: 图中可能存在回路,且图的任一顶点都可能与其他顶点相同,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问的顶点。(例如,图中v2 和 v3) 那么如何避免重复访问? 图的常用遍历 参考:视频讲解 青岛大学–王卓 首先,我们选择 v2 为起始点,则 visited[ 1 ] = 1( visited[ n ] = [ 0,1,0,0,0,0 ] ) 接下来,看邻接矩阵 v1 这一行,可以看出 v2、v3、v4 均与 v1 相连,则从后两者之间做出选择,选择 v3(设置 visited[ 2 ] = 1;visited[ n ] = [ 1,1,1,0,0,0 ]); 以此类推,下一个邻接点为 v5(设置 visited[ 4 ] = 1;visited[ n ] = [ 1,1,1,0,1,0 ]) ,接下来与 v5 邻接的 v2、v3 均已经访问过,则依次退回 v2、v1,发现有未访问的点 v4,则选该点为下一个邻接点,之后一直重复上述操作。。。 最终达到 visited[ n ] = [ 1,1,1,1,1,1 ],访问路径为 v2 – v1 – v3 – v5 – v4 – v6 用邻接矩阵来表示图(假设有 n 个顶点,则为 n*n矩阵) 用邻接表表示图 结论: 参考:视频讲解 青岛大学–王卓 其实就是一层一层的访问,如下例 BFS 算法效率分析 更多关于图的应用:文章目录
一,图的定义的基本术语
稀疏图: 有很少边或弧的图(e < n*log n)。
互为邻接点
;邻接到
vj,vj 邻接于
vi。
路径: 接续的边构成的顶点序列。
路径长度: 路径上边或弧的数目 / 权值之和。
例,有无向图如上图,由 v5 到 v3 的路径可以是 [v5,v2,v3] 也可以是 [v5,v4,v3] 或 [v5,v2,v4,v3] 和 [v5,v4,v2,v3]。它们的路径长度分别为 2,2,3,3;若有权值的话需要将权值相加。
回路(环): 第一个顶点和最后一个顶点相同的路径。(起点与重点相同)
简单路径: 除路径起点和终点可以相同外,其余顶点均不相同的路径。
简单回路(简单环): 除路径起点和终点相同外,其余顶点均不相同的路径。
(a)简单路径:0 – 1 – 3 – 2,起点终点可以不同,但不能出现重复顶点。
(b)非简单路径:0 – 1 – 3 – 0 – 1 – 2,顶点 v0 和 v1 重复了。
(c)回路:0 – 1 – 3 – 0,起点和终点均为 v0
权与网: 图中边或弧所具有的相关数称为权(表明从一个顶点到另一个顶点的距离或耗费)。带权的图称为网。
连通分量(强连通分量)
极大连通子图意思是:该子图是 G 连通子图,将 G 的任何不在该子图中的顶点加入,子图不再连通。
极大强连通子图意思是:该子图是 G 的强连通子图,将 G 的任何不在该子图中的顶点加入,子图不再是强连通的。
极小连通子图: 该子图是G 的连通子图,在该子图中删除任何一条边子图都不再连通。
生成树: 包含无向图G 所有顶点的极小连通子图。
生成森林: 对非连通图,有各个连通分量的生成树的集合
二,邻接(Adjacency)
邻接: 有边 / 弧相连的两个顶点之间的关系。
互为邻接点
;邻接到
vj,vj 邻接于
vi。2.1 列表表示(Adjacency-List)
可藉由 Adjacency-list 表示,将每一个相邻的点集合用一个List 存起來。
有向图
可藉由Adjacency-List表示,將每個點所指向的點集合存在List中。
2.2 矩阵表示(Adjacency-Matrix)
可藉由 Adjacency-Matrix 表示,利用一個二維矩阵將每對點之間是否有邊連起來;
有向图
可藉由 Adjacency Matrix 表示,利用一個二維矩阵A
三,图的遍历
解决思路:设置辅助数组 visited[ n ],用来标记是否访问过该顶点
3.1 深度优先搜索(DFS)
引例:点亮所有的灯
思路:选择一条路径,已知走到没有未点亮的灯或到尽头时再回头,每次退一步,若有未点亮的灯则选择该点,若没有未点亮的灯则再退回一步,直到所有灯全部都被点亮。
最初的选择不同,会有不同的访问路径。
3.1.1 深度优先搜索遍历算法的实现
设置辅助数组 visited[ n ] = [ 0,0,0,0,0,0 ],分别对应每一个顶点 vi
然后来看邻接矩阵,只看 v2 这一行就可以,可以看出与 v1 相连,则我们走到顶点 v1(设置 visited[ 0 ] = 1;visited[ n ] = [ 1,1,0,0,0,0 ]);
void DFS(AMGraph G, int v){ //图G为邻接矩阵类型 cout<<v; //访问第v个顶点 visited[v] = true; //依次检查邻接矩阵v所在的行 for(w = 0; w < G.vexnum; w++) if((G.arcs[v][w] != 0)&&(!visited[w])) DFS(G, w), //w是v的邻接点,如果w未访问,则递归调用DFS }
3.1.2 DFS 算法效率分析
3.1.3 非连通图的遍历
以上图为例:
首先,以a为初始点(随机的),接下来按照上边的步骤依次找到邻接点直到全部都访问过(该连通分量已经遍历完成),因为我们知道是非连通图,则我们在没有访问过得顶点中再随机找一个顶点开始新的遍历。3.2 广度优先搜索(BFS)
与DFS不同,广度优先搜索是先选定一个初始点,然后访问他所有的邻接点,如下图所示
方法:
非连通图的广度遍历
3.2.1 实现和步骤
以上图为例:
visited[ n ] = [ 0,0,0,0,0,0,0,0 ] 用来记录顶点是否访问过,访问后设置 visited[ i ] = 1;
next[ n ] = [ -1,-1,-1,-1,-1,-1,-1,-1 ] 用来记录访问点的所有未访问邻接点;
visited[ n ] = [ 1,1,1,1,1,1,1,1 ]
next[ n ] = [ 1,2,3,4,5,6,7,8 ]3.2.2 BFS 算法及其效率
void BFS(Graph G, int v){ // 按广度优先非递归遍历连通图G cout<<v; // 访问第 v 个顶点 visited[v] = true; InitQueue(Q); // 辅助队列Q初始化,置空 EnQueue(Q, v); // v 进队 while(!QueueEmpty(Q)){ // 队列非空 DeQueue(Q, u); // 队头元素出队并置为 u for(w = FirstAdjVex(G,u);w >= 0;w = NextAdjVex(G, u, w)) if(!visited[w]){ // w 是 u尚未访问的邻接点 cout<<w; visited[w] = true; EnQueue(Q, w); // w 进队 }// }// }//
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算