判断一个图是否是二分图,如果图是二分图,返回 true ;否则,返回 false 。 二分图定义:如果能将一个图的节点集合分割成两个独立的子集 A 和 B,并使图中 的每一条边的两个节点一个来自 A 集合,一个来自 B 集合,就将这个图称为二分图。 (力扣上的题)c语言写
时间: 2024-10-28 18:06:42 浏览: 29
为了判断一个图是否为二分图,可以使用深度优先搜索(DFS)算法,同时维护两个集合(A和B),用于跟踪当前访问过的节点。以下是C语言的实现方法:
```c
#include <stdbool.h>
#include <stdio.h>
// 假设 adj[] 是邻接表表示的图,n 是节点数
bool is BipartiteGraph(int adj[], int n, int *color) {
// color[i] 表示节点 i 被分配的颜色,初始化为 -1 表示未访问
for (int i = 0; i < n; i++) {
if (color[i] == -1) {
// 对于每个未访问节点,应用 DFS
if (!dfs(adj, n, i, color, 0)) {
return false; // 如果无法完成颜色分配,图不是二分图
}
}
}
return true;
}
// DFS 递归函数
bool dfs(int adj[], int n, int node, int color[], int c) {
// 检查节点是否已经着色
if (color[node] != -1 && color[node] != c) {
return false; // 如果节点已着色且颜色不同,不是二分图
}
// 给节点着色
color[node] = c;
for (int i = 0; i < n; i++) {
// 如果与相邻节点有边且对方不在同一部分
if (adj[node][i] > 0 && color[i] == -1) {
if (!dfs(adj, n, i, color, 3 - c)) { // 使用3-c避免颜色冲突
return false;
}
}
}
return true;
}
// 主函数测试
int main() {
int adj[/* 图的邻接矩阵大小 */], n; // 邻接表表示的图及节点数
scanf("%d", &n);
// 输入邻接矩阵 adj
// ...
int color[n]; // 初始化颜色数组
for (int i = 0; i < n; i++) {
color[i] = -1;
}
if (is BipartiteGraph(adj, n, color)) {
printf("是二分图\n");
} else {
printf("不是二分图\n");
}
return 0;
}
```
这段代码首先遍历图,对每个节点进行 DFS。如果发现某个节点的相邻节点已经被赋予了不同的颜色,那么这不是二分图,返回 false。否则,通过颜色轮询完成二分图的判定。
阅读全文