数据结构之图

1.概念

(1)什么叫图?

由顶点集合及顶点间的关系集合组成的一种数据结构。顶点间的关系称为边。

(2)图的类型

  • 无向图:图的边没有方向。

  • 有向图:图的边有方向。

  • 完全图:图的边数达到最大值。无向完全图的边数为n*(n-1)/2,有向完全图的边数为n*(n-1)。

  • 带权图:图的边具有权值。

(3)图的属性

  • 邻接顶点:若(vi,vj)是无向图E(G)中的一条边,则称vi和vj互为邻接顶点。

  • :与顶点vi关联的边数。度为0的称为孤立点,度为1的称为悬挂点。在有向图中,以vi为终点的度称为vi的入度,以vi为起点的度称为vi的出度。

  • 子图:设图G=(V,E),G’=(V’,E’),若V’∈V,E’∈E,则称G’是G的子图。如果G’≠G,则称图G’是G的真子图。若G’是G的子图,且V=V’,称图G’是图G的生成子图。

  • 路径:若存在顶点序列(vi,vp1,vp2,…,vpm,vj)且边(vi,vp1)、(vp1,vp2)、…、(vpm,vj)都是E(G)的边,则称顶点序列(vi,vp1,vp2,…,vpm,vj)是从顶点vi到vj的一条路径。对于不带权图,路径长度指该路径上的边数;对于带权图,路径长度指该路径上各条边的权值之和。

  • 连通性:在无向图G中,若从顶点vi到vj有路径,则称vi和vj是连通的。若图G中任意一对顶点vi和vj(vi≠vj)都是连通的,则称G为连通图。非连通图的极大连通子图称为该图的连通分量。在有向图中,若在每对顶点vi和vj(vi≠vj)之间都存在一条从vi到vj的路径,也存在一条从vj到vi的路径,则称该图是强连通图。非强连通图的极大强连通子图称为该图的强连通分量。

数据结构之图

数据结构之图

数据结构之图

数据结构之图

1.图的存储形式

存储一个图包括存储顶点集合和边集合。顶点集合采用顺序表存储,而边集合可以采用邻接矩阵,邻接表等存储结构。

(1)边集合采用邻接矩阵的形式存储。

a.不带权值的邻接矩阵的表示
数据结构之图
如果顶点A到顶点B之间有边,则A[A][B] = 1,否则 A[A][B] = 0。

b.带权值的邻接矩阵的表示
数据结构之图

(2)边集合采用邻接表的形式存储
数据结构之图

(3)边集合采用邻接多重表的形式存储
这个书上和网上都没有比较详细的资料说明,如果有好的资料提供,请留言给我,谢谢T_T。

2.图的遍历

图的遍历包含深度优先遍历和广度优先遍历。


3.最小生成树的构造算法

(1)Prim算法
先选择顶点A加入TV中,计算顶点A到其他顶点的距离,选择权值最小的边。将权值最小的边的顶点加入TV。再计算TV中的顶点到剩余顶点的权值。重复直到全部顶点加入TV,边数是顶点数-1。
数据结构之图

(2)Kruskal算法
每次选择权值最小的边加入,连成一棵树。边数是顶点数-1。
数据结构之图


4.最短路径

(1)非负权值的单源最短路径(Dijkstra算法)
数据结构之图
a.以A为起点,比较从A到B,C,D,E的距离。

起点 终点 权值
A B 11
A C
A D
A E 4

选择最小的边(A,E)。

b.以A为起点,E为经过点,比较从A到B,C,D的距离

起点 经过点 终点 权值
A B 11
A C
A E D 6
A E 4

(A,E,B)的权值是12,比11大,不替换(A,B)。选择最小的边(A,E,D)。

c.以A为起点,E,D为经过边,比较从A到B,C的距离

起点 经过点 终点 权值
A B 11
A C
A E D 2
A E 4

选择最短边(A,B)

d.以A为起点,E,D,B为经过边,比较从A到C的距离

起点 经过点 终点 权值
A B 11
A B C 29
A E D 6
A E 4

选择最短边(A,C)。


(2)每对顶点间的最短路径(Floyd算法)
a.计算A点到A,B,C,D点的距离。
计算B点到A,B,C,D点的距离。
计算C点到A,B,C,D点的距离。
计算D点到A,B,C,D点的距离。
b.再依次以A,B,C,D点为经过点,重复计算a的结果。
数据结构之图

综上,自己的理解是:

  • prim是通过找加入最小树的顶点到未加入的顶点间的最小值来构造最小树(点与点之间的距离,不经过中间顶点)。
  • kruskal是找权值最小的边来构造最小树。
  • dijkstra算法是以一个顶点为源点,计算这个顶点到其他顶点的距离,每次将最小的边加入,上次最小边的顶点可以作为下一次计算的经过点。
  • Floyd算法是计算每个顶点到其他顶点的距离,将每个顶点依次作为中间顶点计算最小权值。

给自己的学习做个记录,有哪里可以提高的地方希望大家指出。