【图论】二分图 // 未完成 =、=

luogu大佬分享二分图具体定义
博客转载自https://www.cnblogs.com/SINXIII/p/10560506.html,内容为一个luogu大佬所写的二分图具体定义。
二分图(Bipartite Graph)是图论中的一种特殊图结构,其核心特性是**顶点集可以被划分为两个互不相交的子集,且图中每条边的两个顶点分别属于这两个子集**。以下是详细解释: --- ### 1. **定义与形式化描述** - **定义**:若图 \( G = (V, E) \) 的顶点集 \( V \) 能被划分为两个子集 \( U \) 和 \( W \)(即 \( V = U \cup W \),且 \( U \cap W = \emptyset \)),且图中每条边 \( (u, v) \in E \) 满足 \( u \in U \) 且 \( v \in W \)(或反之),则称 \( G \) 为二分图。 - **直观理解**:二分图可以看作“两层图”,所有边只连接不同层的顶点,同一层内无直接边。 #### 示例: - **学生选课系统**: - 子集 \( U \):学生集合 - 子集 \( W \):课程集合 - 边:学生选修课程的关系(学生 \( \to \) 课程)。 - 显然,学生之间不会直接“选修”彼此,课程之间也不会“选修”学生,满足二分图定义。 --- ### 2. **二分图的判定** #### 方法1:二分着色法(BFS/DFS) - **思想**:尝试用两种颜色(如红、蓝)对顶点着色,要求相邻顶点颜色不同。若能成功完成,则为二分图。 - **步骤**: 1. 选任意顶点,标记为颜色A。 2. 遍历其邻接顶点,标记为颜色B。 3. 递归处理所有未标记顶点。 4. 若发现相邻顶点颜色相同,则非二分图。 #### 示例代码(BFS实现): ```cpp #include <vector> #include <queue> using namespace std; bool isBipartite(vector<vector<int>>& graph) { int n = graph.size(); vector<int> color(n, -1); // -1:未着色, 0:颜色A, 1:颜色B for (int i = 0; i < n; i++) { if (color[i] == -1) { queue<int> q; q.push(i); color[i] = 0; // 起始顶点着色A while (!q.empty()) { int u = q.front(); q.pop(); for (int v : graph[u]) { if (color[v] == -1) { color[v] = color[u] ^ 1; // 相邻顶点着相反颜色 q.push(v); } else if (color[v] == color[u]) { return false; // 颜色冲突,非二分图 } } } } } return true; } ``` #### 方法2:无奇数长度环 - **性质**:二分图等价于**不包含奇数长度的环**(即所有环的长度均为偶数)。 - **证明**:若存在奇数环,则无法用两种颜色交替着色,矛盾。 --- ### 3. **二分图的常见应用** 1. **匹配问题**: - **二分图最大匹配**:求两组顶点间最多能匹配多少对边(如任务分配、婚姻匹配)。 - **算法**:匈牙利算法(时间复杂度 \( O(VE) \))。 2. **网络流问题**: - 二分图是构造网络流模型的基础(如最大流、最小割)。 3. **推荐系统**: - 用户-物品二分图,通过边权重(如评分)推荐相似物品。 4. **着色问题**: - 地图着色、调度问题等可建模为二分图。 --- ### 4. **二分图 vs 非二分图对比** | **特性** | **二分图** | **非二分图** | |------------------|-------------------------------|---------------------------| | 顶点划分 | 可分为两个独立集 \( U \) 和 \( W \) | 无法严格划分为两独立集 | | 边连接规则 | 仅连接 \( U \) 和 \( W \) 的顶点 | 允许同一集合内顶点相连 | | 典型结构 | 学生-课程、任务-机器 | 社交网络(用户间可互相关注) | | 环长度 | 无奇数环 | 可能存在奇数环 | --- ### 5. **示例图解** #### 二分图示例: ``` U: A --- C \ / \ / B W: 1 --- 2 ``` - 顶点集 \( U = \{A, B, C\} \),\( W = \{1, 2\} \)。 - 边:\( (A,1), (A,2), (B,1), (C,2) \)。 - 无同一集合内边,是二分图。 #### 非二分图示例: ``` A --- B | | C --- D ``` - 存在环 \( A \to B \to D \to C \to A \)(长度为4,偶数),但若添加边 \( (A,C) \),则形成奇数环 \( A \to C \to D \to A \)(长度为3),非二分图。 --- ### 总结 - **二分图**:顶点分两集,边仅跨集连接。 - **判定**:二分着色法或检查无奇数环。 - **应用**:匹配、网络流、推荐系统等。 - **关键性质**:无奇数环 ⇨ 可二分着色 ⇨ 是二分图。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值