什么是图?
图是由顶点的有穷非空集合和顶点间之间的边的集合组成。通常表示为G(V,E)。
V是顶点的集合,E是边的集合。
各种图定义
无向边
若顶点vi到vj之间的边没有方向,则称这条边为无向边。用无序偶对(v1,v2)来标示。
无向图
如果图中任意两个顶点间的边都是无向边,则称该图为无向图。
无向完全图
如果任意两个顶点都存在边,则称该图为无向完全图。
有向边
若顶点vi到vj之间的边有方向,则称这条边为有向边,也称弧(Arc),用有序偶对
有向图
如果途中任意两个顶点之间的边都是有向边,则称该图为有向图。
有向完全图
如果任意两个顶点间都存在方向互为相反的两条弧,则称该图为有向完全图。
简单图
在图中,若不存在顶点到自身的边,且同一边不重复出现,称这样的图为简单图。
网
带权的图称为网
子图
子图的顶点和边分别是父图的子集。
图的顶点和与边的关系
邻接点
对于无向图G = (V,{E}),如果边(v,v')属于 E ,那么v,v' 互为邻接点。
顶点的度
顶点的度是和V相关联的边的数目。记为TD(v)。
邻接到,邻接自
对于有向图G = (V,{E}),如果弧(v,v')属于E,那么称顶点v邻接到顶点v'.顶点v'邻接自顶点V
以顶点V为头的弧度称为V的入度
以顶点v为尾的弧的数目称为v的出度。
顶点V的度为 入度+出度
路径的长度是路径上的边或弧的数目
回路和环
第一个顶点到最后一个顶点相同的路径称为回路或环。
序列中顶点不重复出现的路径称为简单路径。
除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路,称为简单回路或简单环。
连通图相关术语
连通图
无向图中,如果从顶点v到v'有路径。则称v和v'是联通的。如果图中任意两个顶点都是连通的,则称G是连通图。
连通分量
无向图中的极大连通子图称为连通分量。
强调:
1 要是子图
2,子图要是连通的
3,连通子图含有极大顶点数。
4,具有极大顶点数的连通子图包含依附于这些顶点的所有边。
强连通子图
在有向图G中,如果每一对顶点,从Vi到Vj,从Vj到Vi都存在路径,则称G是强连通股。有向图中的极大强连通子图称做有向图的强连通分量。
生成树
所谓的一个连通图的生成树是一个极小的连通图,但只有足以构成一颗树的n-1条边。
如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一颗棵有向树。
图的存储结构
五种不同的存储结构
1,邻接矩阵
图的邻接矩阵存储方式是两个数组来表示图,一个一维数组存放顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
某个顶点的度,其实就是这个顶点Vi在邻接矩阵中第i行(或第i列)的元素之和。
有向图样例中,矩阵并不对称。
V1的入度为V1各列之和。
V1的出度为V1各行之和。
从代码中,n个顶点和e条边的无向网图创建的,时间复杂度为O(n+n^2 + e),其中对邻接矩阵的初始化耗时0(n^2)
2,邻接表
将数组与链表相结合的存储方式称为邻接表。
- 图中顶点用一个一维数组存储(数组更容易读取顶点信息),每个数据元素还需要存储一个指向第一个邻接点的指针。
- 图中每个顶点的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以用单链表存储,无向图称为顶点的Vi的边表。有向图称为顶点Vi的弧尾的出边表。
顶点表的各个结点有数据域和指针域构成,数据域存储数据本身,指针域指向边表的第一个结点。
边表中的结点由邻接点指针域和next指针域构成,邻接点指针域指向邻接点在顶点表中的下标。next存储指向边表中下一个结点的指针。
若是有向图
边链表需要建立2个,一个以顶点为入度。一个以顶点为出度。
对于带权值的网图,可以在边结点链表中加一个weight的数据域,存放权值信息即可。
3 十字链表
把有向图中的邻接表和逆邻接表结合起来。
顶点表结点结构
数据域 | 入边表头指针 | 出边表头指针 |
---|---|---|
data | firstin | firstout |
边表结点结构
弧起点在顶点中的下标 | 弧终点在顶点中的下标 | 入边表指针域,指向终点相同的下一条边 | 出边表指针域,指向起点相同的下一条边 | 权值 |
---|---|---|---|---|
tailvex | headvex | headline | taillink | weight |
4,邻接多重表
某条边依附的一个顶点 | 依附于顶点ivex的下一条边 | 这条边依附的另一个顶点 | 依附于顶点jvex的下一条边 |
---|---|---|---|
ivex | ilink | jvex | jlink |
5,边集数组
边集数组由2个一维数组构成。一个存储顶点的信息。
另一个存储边的信息,这个边数组的每个数据元素由一条起点下标,终点下标和权组成。边集数组关注的是边的集合。
它更适合对边进行的操作,而不适合对顶点进行的操作。
边数组结构
起点下标 | 终点下标 | 权重 |
---|---|---|
begin | end | weight |
图的遍历
图的遍历需要设置一个访问数组,访问过的顶点初值设为0,访问过设为1.这样避免重复访问
深度优先遍历(DFS)
适合目标比较明确,以找到目标为主要的目的情况。
广度优先遍历(BFS)
适合在不断扩大范围时找到最优解的情况
两者时间复杂度是一样的,不同之处仅仅在于对顶点的访问的顺序不同。