二分图(Bipartite Graph)是一种特殊的图,它的顶点可以被分成两个互不相交的集合,使得图中的每条边都是连接两个不同集合中的顶点。判断一个图是否是二分图,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法。
下面是一个使用DFS实现的判断二分图的C++代码示例:
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
const int MAX_V = 1000;
vector<int> adjList[MAX_V]; // 邻接列表表示图
int color[MAX_V]; // 用于标记顶点的颜色,0表示未着色,1和2表示两个不同的颜色
bool visited[MAX_V]; // 标记顶点是否被访问过
bool isBipartite(int v, int c = 1) {
if (color[v] != 0) {
return color[v] == c;
}
color[v] = c;
visited[v] = true;
for (int u : adjList[v]) {
if (!visited[u]) {
if (!isBipartite(u, 3 - c)) {
return false;
}
} else if (color[u] == c) {
return false;
}
}
return true;
}
int main() {
int V, E, u, v;
// 输入图的信息
cin >> V >> E;
for (int i = 0; i < E; i++) {
cin >> u >> v;
adjList[u].push_back(v);
adjList[v].push_back(u);
}
// 初始化颜色和访问标记
for (int i = 1; i <= V; i++) {
color[i] = 0;
visited[i] = false;
}
// 对每个连通分量进行判断
bool bipartite = true;
for (int i = 1; i <= V; i++) {
if (!visited[i]) {
if (!isBipartite(i)) {
bipartite = false;
break;
}
}
}
if (bipartite) {
cout << "The graph is bipartite." << endl;
} else {
cout << "The graph is NOT bipartite." << endl;
}
return 0;
}
在这个代码示例中:
是一个邻接列表,用于存储图的信息。
函数实现了DFS算法,用于判断一个图是否是二分图。
用于标记顶点的颜色,初始值为0
,表示未着色。在DFS过程中,如果顶点的颜色为0
,则将其着色为当前颜色
。如果顶点的颜色不为0
,则检查其颜色是否和当前颜色c
相同,如果相同则返回
,表示图不是二分图。
用于标记顶点是否被访问过,防止重复访问同一个顶点。- 英文完全是耍帅~~~
在主函数中,首先读入图的信息,然后对每个连通分量调用
函数进行判断,最后输出判断结果。
请注意,这个代码示例假设图的顶点编号从 1
开始。如果你的图顶点编号从 0
开始,需要对相关部分进行相应的修改。