|
| 1 | +## 1.1 二分图的定义 |
| 2 | + |
| 3 | +> **二分图(Bipartite Graph)**:一种特殊的图,其顶点集可以被划分为两个互不相交的子集,使得图中的每一条边都连接着这两个子集中的顶点。换句话说,二分图中的顶点可以被分成两组,使得同一组内的顶点之间没有边相连。 |
| 4 | + |
| 5 | +## 1.2 二分图的性质 |
| 6 | + |
| 7 | +1. **染色性质**:二分图是二色的,即可以用两种颜色对顶点进行着色,使得相邻顶点颜色不同。 |
| 8 | +2. **无奇环**:二分图中不存在长度为奇数的环。 |
| 9 | +3. **最大匹配**:二分图的最大匹配问题可以通过匈牙利算法或网络流算法高效求解。 |
| 10 | + |
| 11 | +## 1.3 二分图的判定 |
| 12 | + |
| 13 | +判断一个图是否为二分图的方法: |
| 14 | + |
| 15 | +1. 使用深度优先搜索(DFS)或广度优先搜索(BFS)进行二着色 |
| 16 | +2. 如果在染色过程中发现相邻顶点颜色相同,则该图不是二分图 |
| 17 | +3. 如果能够成功完成二着色,则该图是二分图 |
| 18 | + |
| 19 | +## 1.4 二分图的应用场景 |
| 20 | + |
| 21 | +1. **任务分配**:将工人和任务分别作为两个顶点集,边表示工人可以完成的任务 |
| 22 | +2. **婚姻匹配**:将男性和女性分别作为两个顶点集,边表示可能的配对关系 |
| 23 | +3. **网络流问题**:许多网络流问题可以转化为二分图最大匹配问题 |
| 24 | +4. **资源分配**:将资源和需求分别作为两个顶点集,边表示资源可以满足的需求 |
| 25 | + |
| 26 | +## 1.5 二分图的基本算法 |
| 27 | + |
| 28 | +1. **匈牙利算法**:用于求解二分图的最大匹配 |
| 29 | +2. **Hopcroft-Karp算法**:用于求解二分图的最大匹配,时间复杂度更优 |
| 30 | +3. **网络流算法**:将二分图最大匹配问题转化为最大流问题求解 |
| 31 | + |
| 32 | +## 1.6 二分图的判定代码 |
| 33 | + |
| 34 | +```python |
| 35 | +def is_bipartite(graph): |
| 36 | + """ |
| 37 | + 判断图是否为二分图 |
| 38 | + :param graph: 邻接表表示的图 |
| 39 | + :return: 是否为二分图 |
| 40 | + """ |
| 41 | + n = len(graph) |
| 42 | + colors = [0] * n # 0表示未染色,1和-1表示两种不同的颜色 |
| 43 | + |
| 44 | + def dfs(node, color): |
| 45 | + colors[node] = color |
| 46 | + for neighbor in graph[node]: |
| 47 | + if colors[neighbor] == color: |
| 48 | + return False |
| 49 | + if colors[neighbor] == 0 and not dfs(neighbor, -color): |
| 50 | + return False |
| 51 | + return True |
| 52 | + |
| 53 | + for i in range(n): |
| 54 | + if colors[i] == 0 and not dfs(i, 1): |
| 55 | + return False |
| 56 | + return True |
| 57 | +``` |
| 58 | + |
| 59 | +## 1.7 常见问题类型 |
| 60 | + |
| 61 | +1. 判断图是否为二分图 |
| 62 | +2. 求二分图的最大匹配 |
| 63 | +3. 求二分图的最小点覆盖 |
| 64 | +4. 求二分图的最大独立集 |
| 65 | +5. 求二分图的最小路径覆盖 |
| 66 | + |
| 67 | +## 1.8 注意事项 |
| 68 | + |
| 69 | +1. 在实现二分图算法时,需要注意图的表示方式(邻接表或邻接矩阵) |
| 70 | +2. 对于大规模图,需要考虑算法的空间复杂度 |
| 71 | +3. 在实际应用中,可能需要根据具体问题对基本算法进行优化 |
| 72 | +4. 处理有向图时,需要先将其转换为无向图再判断是否为二分图 |
0 commit comments