【数据结构第五周】图(上)

1、什么是图

表示多对多的关系

包含一组顶点:通常用V(Vertex)表示顶点集合

一组边:通常用E(Edge)表示边的集合

2、抽象数据类型定义

类型名称:图(Graph)

数据对象集:G(V,E)由一个非空的有限顶点集合V和一个有限边集合E组成。

操作集:对于任意图G 属于 Graph,以及v 属于 V,e 属于 E

Graph Create():建立并返回空图;

Graph InsertVertex(Graph G, Vertex v):将v插入G;

Graph InsertEdge(Graph G, Edge e):将e插入G;

void DFS(Graph G, Vertex v):从顶点v出发深度优先遍历图G;

void BFS(Graph G, Vertex v):从顶点v出发宽度优先遍历图G;

void ShortestPath(Graph G, Vertex v, int Dist[]):计 算图G中顶点v到任意其他顶点的最短距离;

void MST(Graph G):计算图G的最小生成树;

3、用邻接矩阵表示一个图

邻接矩阵G[N][N]——N个顶点从0到N-1编号

G[i][j] =1 若<vi,vj>是G中的边 ,否则,G[i][j] =0

Q:对于无向图的存储,怎样可以省一半空间?

A:

用一个长度为N(N+1)/2的1维数组A存储 {G00,G10,G11,......,Gn-1 0,...,Gn-1 n-1},

则Gij在A中对应的下标是: (i*(i+1)/2+j)

对于网络,只要把G[i][j]的值定义为边<vi ,vj >的权重即可。

邻接矩阵的好处:

直观、简单、好理解

方便检查任意一对顶点间是否存在边

方便找任一顶点的所有“邻接点”(有边直接相连的顶点)

方便计算任一顶点的“度”(从该点发出的边数为“出 度”,指向该点的边数为“入度”)

(无向图:对应行(或列)非0元素的个数 ,有向图:对应行非0元素的个数是“出度”;对应列非0元素的 个数是“入度” )

邻接矩阵的坏处:

浪费空间 —— 存稀疏图(点很多而边很少)有大量无效元素

浪费时间 —— 统计稀疏图中一共有多少条边

4、用邻接表表示一个图

方便找任一顶点的所有“邻接点”

节约稀疏图的空间(需要N个头指针 + 2E个结点(每个结点至少2个域) )

对无向图来说是方便计算任一顶点的度的,对有向图来说只能计算出度,需要构造“逆邻接表”(存指向自己 的边)来方便计算“入度”

不方便检查任一顶点的是否存在边

5、图的遍历

深度优先搜索

类似于树的先序遍历

void DFS ( Vertex V )
{
     visited[ V ] = true;
     for ( V 的每个邻接点 W )
           if ( !visited[ W ] )
                DFS( W );
}

若有N个顶点、E条边,时间复杂度是 :

用邻接表存储图,有O(N+E)

用邻接矩阵存储图,有O(N^2)

广度优先搜索

??void BFS ( Vertex V )
{        visited[V] = true;
          Enqueue(V, Q);
          while(!IsEmpty(Q)){
              V = Dequeue(Q);
              for ( V 的每个邻接点 W )
                   if( !visited[W] ) {
                     visited[W] = true;
                     Enqueue(W, Q);
                     }
          }
}

若有N个顶点、E条边,时间复杂度是 :

用邻接表存储图,有O(N+E)

用邻接矩阵存储图,有O(N^2)

6、图不连通怎么办

相关概念:

连通:如果从V到W存在一条(无向)路径,则称 V和W是连通的

路径:V到W的路径是一系列顶点{V, v1, v2, ..., vn, W}的集合,其中任一对相邻的顶点间都有图

中的边。路径的长度是路径中的边数(如果带 权,则是所有边的权重和)。如果V到W之间的所有顶点都不同,则称简单路径

回路:起点等于终点的路径 连通图:图中任意两顶点均连通

连通图:图中任意两顶点均连通

连通分量:无向图的极大连通子图 (极大顶点数:再加1个顶点就不连通了 极大边数:包含子图中所有顶点相连的所有边 )

对于有向图我们分强连通和弱连通的概念。

强连通:有向图中顶点V和W之间存在双向路 径,则称V和W是强连通的

强连通图:有向图中任意两顶点均强连通

强连通分量:有向图的极大强连通子图

时间: 2024-11-03 22:45:07

【数据结构第五周】图(上)的相关文章

ThinkPHP学习(五)图上验证码

前言 不管这篇写到哪里,就以这篇作为结尾,结束这个流水回顾系列文了. Computer History Museum 计算机历史博物馆(网站)是在Google旁边,参观Google之前的行程. 记得那是一个阳光明媚的日子,在前往硅谷朝圣的路上,内心还是有点小激动的. 临走前我买了顶帽子作纪念,也刚好用来抵御湾区的大太阳. Google 大家在计算机历史博物馆外合影了一张,然后就奔赴Google了. 上图的小机器人们很有趣. Google的园区自行车很绚烂,让我联想到Chrome. 接着见识了传说

数据结构(五)图---图的存储结构5种

一:图的抽象数据类型 ADT 图(Graph) Data 顶点的有穷非空集合和边的集合 Operation CreateGraph(*G,V,VR):按照顶点集V和边弧集VR的定义构造图G DestroyGraph(*G):图G存在则销毁 LocateVex(G,u):若图G中存在顶点u,则返回图中位置 GetVex(G,v):返回图中顶点v的值 PutVex(G,v,value):将图G中顶点v赋值给value FirstAdjVex(G,*v):返回顶点v的一个邻接顶点,若顶点在G中无邻接顶

数据结构(五)图---最短路径(弗洛伊德算法)

一:定义 弗洛伊德算法是用来求所有顶点到所有顶点的时间复杂度. 虽然我们可以直接对每个顶点通过迪杰斯特拉算法求得所有的顶点到所有顶点的时间复杂度,时间复杂度为O(n*3),但是弗洛伊德算法更加简洁优雅 二:弗洛伊德的使用介绍 若是求一个顶点到其他顶点的最短距离,例如迪杰斯特拉算法,我们的距离数组和路径数组使用一维即可,但是我们这里是获取所有顶点到其余顶点的最短距离,所以我们对于数组和路径都需要使用二维数组来表示 下面我们使用一个有三个顶点的图来进行讲解: (1)我们先定义两个二维数组D0[3][

数据结构(五)图---最小生成树(普里姆算法)

一:最小生成树 (一)定义 我们把构造连通网的最小代价生成树称为最小生成树 (二)什么是最小生成树? 1.是一棵树 1)无回路 2)N个顶点,一定有N-1条边 2.是生成树 1)包含全部顶点 2)N-1条边都在图中 3.边的权重和最小 (三)案例说明 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经费前提 下建立这个通信网.换句话说,我们须要在这n个城市中找出一个包括全部城市的连通

20172323 2017-2018-2 《程序设计与数据结构》第五周学习总结

教材学习内容总结 条件语句和循环语句可用于控制程序的执行流程 条件语句(选择语句)允许选择下一条执行的语句.Java中主要的条件语句有if.if-else.switch语句 循环语句可以是程序多次执行某些语句,主要的语句有while.do.for语句 相等性运算符和关系运算符:"=="和"!="用于判断两个值是否相等. 逻辑运算符:逻辑非"!",逻辑与"&&",逻辑或"||".逻辑运算符常用

2018-2019-20172329 《Java软件结构与数据结构》第五周学习总结

2018-2019-20172329 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 <Java软件结构与数据结构>第九章-排序与查找 一.查找 1.查找概念简述: (1)查找3是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素.对其进行查找的项目组有时也称为查找组. (2)查找方式的分类:线性查找,二分查找. (3)查找所要完成的目标:尽可能高效的完成查找,从算法分析的角度而言,我们希望最小化比较操作的次数,通常,查找池里项目数

20172333 2018-2019-1 《程序设计与数据结构》第五周学习总结

20172333 2018-2019-1 <程序设计与数据结构>第五周学习总结 教材学习内容总结 ==<Java软件结构与数据结构>第九章-排序与查找== 一.查找 ①.查找概念: 在一个项目中寻找一个元素或者判断一个元素是否存在在这个项目中. ②.查找的类型: 查找在第九章主要讨论了两种类型,一种是线性查找.另一种是二分查找. ③.查找的目标: 查找实际就是不同元素之间的比较过程,而查找的目标就是为了找到某个元素,在查找的同时保持最高效的性能. 二.线性查找法 ①.线性查找法的概

20172327 2018-2019-1 《程序设计与数据结构》第五周学习总结

20172327 2018-2019-1 <程序设计与数据结构>第五周学习总结 教材学习内容总结 第九章 排序与查找 查找 1.查找:在某个项目组中找到指定元素或判断是否存在.该项目组被称为查找池. 2.常见查找方式,线性查找. 3.查找目标:高效地完成查找,用最小化比较操作.通常查找池中项目数目定义了该问题的大小. 4.静态方法(类方法):可通过类名激活 5.在方法声明中,通过static修饰符就可以把它声明为静态的. 6.泛型方法:与泛型类相似,不是创建引用泛型参数的类,而是创建一个引用泛

20172311 2017-2018-2 《程序设计与数据结构》第五周学习总结

20172311 2017-2018-2 <程序设计与数据结构>第五周学习总结 教材学习内容总结 第五六章整体上来讲主要学习了条件判断与循环.小的知识点主要还有: 1.语句执行的顺序称为控制流,方法调用会引起控制流的改变. 2.相等性运算符由两个并列的等号组成,不要和只有一个等号的赋值运算符想混淆. 3.相等性运算符和关系运算符的优先级比算术运算符的优先级低. 4.在三种逻辑运算符中,逻辑非具有最高的优先级,其次是逻辑与,最后是逻辑或.逻辑运算符经常用于构成复杂的条件. 5.编写语句时适当的缩