用c++解决以下问题 问题描述:给定连通的无向图G1,…,Gk,请判定它们是否为二分图。 • 输入格式:第一行一个整数1≤k≤30。接下来的第 i段数据描述图Gi。 • 第i段数据的第一行为n。(1<=n<=400) • 接下来有一个n*n的01矩阵(每行n个数间有空格),表示图Gi的邻接矩阵。 输出格式:为每个Gi输出一行。Yes表示Gi为二分图,No表示不是。
时间: 2024-03-17 07:40:16 浏览: 76
好的,我理解了你的问题。以下是用C++解决这个问题的代码示例:
```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 405;
int n;
int color[MAXN];
vector<int> graph[MAXN];
bool bfs(int start) {
queue<int> q;
q.push(start);
color[start] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < graph[u].size(); i++) {
int v = graph[u][i];
if (color[v] == -1) {
color[v] = 1 - color[u];
q.push(v);
} else if (color[v] == color[u]) {
return false;
}
}
}
return true;
}
bool isBipartite() {
for (int i = 1; i <= n; i++) {
color[i] = -1;
}
for (int i = 1; i <= n; i++) {
if (color[i] == -1) {
if (!bfs(i)) {
return false;
}
}
}
return true;
}
int main() {
int k;
cin >> k;
for (int t = 1; t <= k; t++) {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int x;
cin >> x;
if (x == 1) {
graph[i].push_back(j);
graph[j].push_back(i);
}
}
}
cout << (isBipartite() ? "Yes" : "No") << endl;
for (int i = 1; i <= n; i++) {
graph[i].clear();
}
}
return 0;
}
```
该代码使用了 BFS 算法,对每个连通分量进行染色(二分图中相邻的节点应该染成不同的颜色),如果发现染色冲突,则该连通分量不是二分图。最后,对每个图都进行判断,并输出结果。
阅读全文