(特别感谢zrt大佬对本节目的大力滋磁)
把DP放在一边,我们先来讲讲图论...
图论,顾名思义,就是研究图的,那么图又是什么?
(说这么玄学,一贯是百度百科的风格)
图,是由顶点集V和边的集合E组成的一种数据结构,可以用有序二元组定义为:G=(V,E),其中E的元素都是二元组,用(x,y)表示,x,y∈(属于)V
(还是很玄学)
简单来说图就是一些节点和节点之间的链接关系。
它分为有向图和无向图两类
·有向图:每条边都有一个方向,边有起点,终点,对应的点也分入边、出边
·无向图:边没有方向
接下来介绍一些图论专用术语:
·简单图:无重边、无自环的图(重边&自环.百度知道)
·路径:一组首尾相连边的集合
·度数(入度、出度):连接一个点的边的数量
·连通图:任意两点间都有路径相连
·连通分量(也称连通块):极大连通子图(极大连通子图.知乎)
·完全图:任意两点间有边相连
·有向无环图(也称DAG):(有向无环图.百度百科)
接下来我们来看看图论最重要的知识之一:图的存储
图的存储分为邻接矩阵和邻接表两类,我们分别对其进行描述:
·邻接矩阵:将图存储进一个二维数组之中,map[i][j]表示从i到j有一条路径相连(若有边权则存进map[i][j]中),一般空间为O(N^2),可以处理有向图或无向图,对于重边可直接取优值
·邻接表:用数组实现n个链表,分别存储每个点的所有出边,空间为O(n+m),下面介绍邻接表的加边过程:
假设加入一条a->b的边
1.新建一个链表节点,表示要存储的边
2.纪录这条边的指向、边权等信息
3.把该边加入a的链表头部
(接下来讲Dij.算法的时候会详细讲解理解过程)
·邻接矩阵和邻接表的对比:
1.邻接矩阵是稠密图,邻接表是稀疏图
2.邻接矩阵可以快速找出两个点之间是否有边,而邻接表可以快速找出一个点的所有出边
3.邻接矩阵的空间为O(n^2),邻接表为O(n+m)
接下来讲图的遍历:
对于遍历一个无向连通图,我们有bfs和dfs两种方法(此处不扩展)
·dfs:把等待访问的节点放入一个栈中存储,每次取出一个没有访问过的节点扩展相邻的没有访问过的节点存入栈中,实现时栈用递归代替,顺序为深度优先
·bfs:把等待访问的节点放入队列中存储,每次取出节点扩展后再加入队列,顺序为宽度优先
好了,以上就是图论的第一部分,下一部分预告:用Floyd、Dij和SPFA解决最短路