染色法判定二分图(1)
什么叫二分图
-
有两顶点集且图中每条边的的两个顶点分别位于两个顶点集中,每个顶点集中没有边直接相连接!
-
说人话的定义:图中点通过移动能分成左右两部分,左侧的点只和右侧的点相连,右侧的点只和左侧的点相连。
-
下图就是个二分图:

- 下图不是个二分图:

如果判断一个图是不是二分图?
-
开始对任意一未染色的顶点染色。
-
判断其相邻的顶点中,若未染色则将其染上和相邻顶点不同的颜色。
-
若已经染色且颜色和相邻顶点的颜色相同则说明不是二分图,若颜色不同则继续判断。
-
bfs和dfs可以搞定!
20230723与y总代码模板不同,为自己独立实现,不够美观,但便于自己理解
debug过程:
- 需要注意到本题是无向图,所以add函数需要用两次,还有就是我们使用链式前向星结构去存图,所以ne和e数组需要开两倍的边数。
就是因为数组开小了,导致最后tle了,数组开小了什么报错都有可能出现
- 染色算法能够解决非连通图的二部图判定,所以从一个点dfs出发是不够的,要
多源dfs
也就是说对每个连通块进行dfs,先对一个点dfs后,找此时没有被染色的点再dfs,直到全都被染色或者dfs过程中return false; - 这个dfs过程不需要还原现场,因为我们需要保留所有点的颜色。
- 我的代码中dfs函数只有一个参数,yxc的代码是两个参数,都是可以的?!
1 | #include <bits/stdc++.h> |
双参数版的代码
dfs的含义:将u这个点染成c颜色后,返回值是表示会不会出现冲突
1 | #include <bits/stdc++.h> |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 爱飞鱼的blog!
