1. 二分图染色判定算法解析
二分图判定是图论中的一个经典问题,在实际应用中有着广泛用途。比如社交网络中的好友关系分析、任务调度中的资源分配等场景都会用到。今天我要分享的是基于DFS/BFS的二分图染色判定算法实现,这是每个算法工程师都应该掌握的基础技能。
提示:二分图是指顶点集V可分割为两个互不相交的子集,并且图中每条边所关联的两个顶点分别属于这两个不同的子集。
1.1 算法核心思想
二分图判定的本质是图的二着色问题:能否用两种颜色给图中的顶点着色,使得相邻顶点颜色不同。这听起来简单,但在实现时需要考虑很多细节:
- 连通性处理:图可能是非连通的,需要确保所有连通分量都被检查到
- 染色冲突检测:当发现相邻节点颜色相同时应立即终止算法
- 遍历方式选择:DFS和BFS都适用,各有优缺点
DFS实现通常代码更简洁,但BFS在特定场景下性能更好。下面我们先看DFS的实现思路:
java复制boolean isBipartiteDFS(int node, int c, int[] color, List<Integer>[] adj) {
color[node] = c;
for (int neighbor : adj[node]) {
if (color[neighbor] == c) return false;
if (color[neighbor] == 0 && !isBipartiteDFS(neighbor, -c, color, adj))
return false;
}
return true;
}
1.2 BFS实现详解
虽然标题提到DFS,但提供的代码实际上是BFS实现。BFS使用队列来迭代处理节点,避免了递归的栈开销,在大规模图上更稳定:
java复制// BFS核心逻辑
Queue<Integer> queue = new LinkedList<>();
queue.add(startNode);
color[startNode] = 1;
while (!queue.isEmpty()) {
int cur = queue.poll();
for
