BFS和DFS算法

基本概念

二分图:图中的点分为两组,且所有变都跨越组的边界,即为二分图。或言:把一个图的定点划分为两个不相交集;

匹配:在图论中,匹配是一个边的集合,任一两条边没有公共顶点;

最大匹配:一个图中所有匹配中,所含匹配边最多的匹配;

完美匹配:一个图中的匹配,所有顶点均为匹配点;

:数学上,一个图是表示物体与物体之间关系的方法,是图论基本研究对象。一个图看起来就是由一些小圆点和连接这些远点的直线或曲线组成。

BFS和DFS算法_第1张图片
image

BFS

Breadth-First-Search,宽度优先搜索;

BFS 的步骤:

从 1 开始进行搜索的话,

先搜索所有和 1 相连的,也就是 2 和 5 被找到了,

然后再从 2 开始搜索和他相连的,也就是 3 被找到了,

然后从 5 搜,也就是 4 被找到了,

然后从 3 开始搜索,4 被找到了,但是 4 之前已经被 5 找到了,所以忽略掉就行;

然后 3 开始搜索,忽略 4 所以啥都没搜到,然后从 4 开始,6 被找到了。。。

DFS

Depth-first search,深度优先搜索;

DFS 的步骤:(不到尽头不回头)

从 1 开始,先找到其中一个相连的,2 被找到了,

然后直接开始从 2 开始搜索,3 被找到了,

然后从 3 开始搜索,4 被找到了,

然后从 4 开始搜索,5 被找到了,

然后从 5 开始搜索,忽略已经找到的所以啥都没找到。

然后没路可走了,回到前面去再走另一条路,

从 4 开始,6 被找到了,然后又没路可走了,

然后再回去前面 4,然后没路了,

回去前面 3,然后一直这样。。

图的代码实现

邻接矩阵

直接开一个 N×N 的二维数组 E,然后E [i][j]为 1 的时候表示 i 和 j 之间有一条边,0 的时候就没有。

缺点

  • 超过 1000 个点一般不管是空间还是时间都不允许了;

  • 然后就是如果从 3 到 5 有两条边的话,就没法表示了。

int E[110][110];
E[1][2]=1;

邻接链表

使用链表的方式(vector)保存一个结点的所有边;

vector  E[110];
E[3].push_back(6) // 有一条从3到6的边。

前向星

和链表几乎没什么区别,就是每次添加新的边的时候往开头加,而不是往最后加。(不太理解,暂不扩展)

参考

1.二分图的最大匹配、完美匹配和匈牙利算法

2.BFS 和 DFS 算法原理(通俗易懂版)

3.BFS 、DFS 区别,详解

你可能感兴趣的:(BFS和DFS算法)