Skip to content

Commit 79c30ef

Browse files
committed
更新「二分图基础知识」相关内容
1 parent 3b994ed commit 79c30ef

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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

Comments
 (0)