数据结构-图的概述
一、基本定义
1、图:由点集和弧集(或者为边集)组成的 数据结构。(弧集或边集可为空)
注:弧是有方向的,边可以看成双向的弧。
2、有向图:由点集和弧集的数据结构为有向图。
3、无向图:由点集和边集的数据结构为无向图,无向图的临接矩阵为对称矩阵。
快速区分图是否有向:
1、有向图点的序偶<>表示,无向图的用()表示。
2、无向图边的数目不会大于(点 -1),而有向图的边个数可能会大于(点 - 1)个。
4、网:网是弧或者边带权值的图(网是带权图)。
5、子图:若为子图,则其点集为原图的子集,边集或者弧集为原来图的子集。
6、完全图:
无向完全图:边 = 点×(点 - 1)/2;
有向完全图:弧 = 点×(点 - 1);
7、稀疏图与稠密图:边或弧e满足以下要求为稀疏图:
e < N×logN
否则为稠密图。
8、度:与顶点相关联的边的数目,称为度;有向图又分出度和入度。
9、连通图:任意两点间有途径相通(不一定是两点间的直接相连)
强连通图:上面的连通图的概念是相对于无向图来定义的;对于有向的连通图,则称为强连通图。
10、(强)连通分量:极大连通子图称为的连通分量
(强)连通图: 只有一个(强)连通分量,就是它本身;
非(强)连通图:有 多个连通分量
二、存储信息
1、邻接矩阵表示法(数组表示法)
邻接矩阵的定义:用二维数组存储点与点之间的关联关系;用一维来表示点集合。(无权图用0、 1来表示边是否存在;有权图(即网)用权值表示边的存在,用无穷表示不存在的边)
注:对于无向图的邻接矩阵,它有对称的特性。
2、邻接表表示法(链式存储表示法)
采用链表的形式,对相关联的点点间的关系进行明显的存储:
下面截了学长PPT里的图片(偷懒,不做图了):
无向图的表示:
有向图的表示:
可以看出:1、无向图里面可以看出相应点的度
eg:f点的度为3:分别为f点到b、c、d。
2、有向图里面可以很直观看相应点的出度,通过表里的内容,统计出点的入度;
eg:b点的出度为1; b点的入度为2 :b点到c, d点到b, a点到b。
此外:还有十字链表表示法(主要为了直观方便看出有向图的出入度而设计):主链的信息表由三部分组成,分别为:图上的点集,入度指针域指向,出度指针域指向;副链上的信息表示由四部分组成:前面存储的是相关点的信息,后面存储的是入度指针域和出度指针域,当遇到^的时候,结束计数。
三、图的遍历
1、对于图的遍历由两种方式:广度优先法(Depth First Search) 和 深度优先法(Breadth First Search)。
2、简要的算法思想:
深度优先算法:我们采用栈的思想:
首先将首个节点入栈;栈不空,重复下述步骤:
a、栈顶顶点出栈,如果未访问,则访问并置访问标志;
b、然后将首节点所有未访问的邻接点入栈。
广度优先算法:我们采用队列的思想:
首先将首个节点入队;队不空,重复下述步骤:
a、队头首结点出队;
b、对首节点的所有邻接点,如果邻接点未被访问,则
访问邻接点并置访问标志,然后邻接点入队。