题目:判断无向图G是否为二部图
输入:
正整数n,代表无向图G的阶数;
随后的n行代表G的邻接矩阵,每行有n个数据,每个数据以空格分隔。其中每个数据表示顶点vi邻接顶点vj边的条数。
输出:
若为树,输出yes;
否则,输出no。
思路:color数组用1和-1表示二部图,visit数组表示该节点是否被访问,采用bfs遍历节点
#include<iostream>
#include<queue>
using namespace std;
const int N = 100;
class Graph
{
private:
int n;
int matrix[N][N];
public:
Graph()
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> matrix[i][j];
}
}
}
void bfs()
{
int color[N] = { 0 };
int visit[N] = { 0 };
color[0] = 1;
visit[0] = 1;
queue<int>q;
q.push(0);
while (!q.empty())
{
int t = q.front();
q.pop();
for (int i = 0; i < n; i++)
{
if (matrix[t][i] > 0)
{
if (color[t] == color[i] || t == i)
{
cout << "no" << endl;
return;
}
else if (color[i] == 0)
{
color[i] = -color[t];
q.push(i);
visit[i] = 1;
}
}
}
if (q.empty())
{
for (int i = 1; i < n; i++)
{
if (visit[i] == 0)
{
q.push(i);
color[i] = 1;
visit[i] = 1;
break;
}
}
}
}
cout << "yes" << endl;
}
};
int main()
{
Graph G;
G.bfs();
return 0;
}