图论 (graph) ,其实就是把很多个相同的事物抽象为一个个点,把它们之间的关系抽象为一条边,从而组成一张图。比如我们熟悉的树,他就是一张图。
一. 图的相关定义
图可以分为无向图和有向图,他们分定义分别如下:
- 无向图:
两个点之间的一条边没有规定方向,比如: A 点与 B 点之间有一条路径,那么可以从 A 点到 B 点,也可以从 B 点到 A 点。也就是说这条路是双行道。 - 有向图:
两个点之间的边可能有多条,并且规定了方向。A 到 B 有一条路径,A 可以从这条路到 B ,但是从 B 不可以到 A 。也就是像生活中的汽车单行道,是不可以反向过去的。
图论中的专业术语:
图又分为带权图和无权图。
其实带权图就是在一张图中的任意一条路径都有一个值(题目给出)。而无权图其实就是在两点之间的路径上没有值,(通常把路径上的值置为 1),在储存的时候差别其实也不是很大。
在图中的一些术语:
- 路径:(无向图)相邻顶点的边
- 权值:一条路径上的值
- 连通图:可以从一个任意一个点经过某些路径可以到达任意一个点的图
- 非连通图:与上文相反
- 边:两点之间的一条连线(可能两点之间有多条)
- 有向路径:在有向图中指明了起点和终点的路径
- 有向环:一条至少含有一条边且起点和终点相同的有向路径(当然只存在于有向图中)
- 度 :(有向图)
- 入度:以顶点为起点的边的数目称为这个点的入度
- 出度:以顶点为终点的边的数目称为这个点的出度
- 度:(无向图)连接这个顶点的边的条数称为这个点的度
- 有向无环图:没有环的有向图
- 圈:(无向图)起点与终点重合的一条路径
- 树:(无向图)没有圈的连通图
- 森林:没有圈的非连通图(树和森林其实也是图的一种)
二. 图的储存
对于一张图,我们储存的方式一般有两种:
- 邻接矩阵,也就是用一个矩阵来表示两条边是否相邻,存在路径则为 1 ,不存在则为 0(无向图)(有向图那么矩阵里面存的就应该是权值)
- 邻接表,就是用一张表来储存两个点之间的关系(下面会用代码细讲)
邻接矩阵实现(无向图 && 无权值):