BFS和DFS算法

基本概念
二分图:图中的点分为两组,且所有变都跨越组的边界,即为二分图。或言:把一个图的定点划分为两个不相交集;
匹配:在图论中,匹配是一个边的集合,任一两条边没有公共顶点;
最大匹配:一个图中所有匹配中,所含匹配边最多的匹配;
完美匹配:一个图中的匹配,所有顶点均为匹配点;
图:数学上,一个图是表示物体与物体之间关系的方法,是图论基本研究对象。一个图看起来就是由一些小圆点和连接这些远点的直线或曲线组成。
BFS和DFS算法
文章图片
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 开始搜索,忽略已经找到的所以啥都没找到。
【BFS和DFS算法】然后没路可走了,回到前面去再走另一条路,
从 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 区别,详解

    推荐阅读