题目信息
判断无向图G是否为二部图
输入:
正整数n,代表无向图G的阶数;
随后的n行代表G的邻接矩阵,每行有n个数据,每个数据以空格分隔。其中每个数据表示顶点vi邻接顶点vj边的条数。
输出:
若为树,输出yes;
否则,输出no。
测试样例
测试样例1
4
0 2 0 0
2 0 0 0
0 0 0 1
0 0 1 0
yes
测试样例2
2
1 0
0 0
no
解答
#include <iostream>
#include <queue>
using namespace std;
int N;
int map[100][100];
int color[100];
//-1,1两个颜色,0未染色
bool bfs(int s)
{
queue<int> p;
p.push(s);
color[s] = 1;
while (!p.empty())
{
int from = p.front();
p.pop();
for (int i = 0; i < N; i++)
{
if (map[from][i] && color[i] == 0)
{
p.push(i);
color[i] = -color[from];//染成不同的颜色
}
if (map[from][i] && color[from] == color[i])//颜色有相同,则不是二分图
return false;
}
}
return true;
}
int main()
{
freopen("E://test.txt", "r", stdin);
cin >> N;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> map[i][j];
}
}
for (int i = 0; i < N; i++)
{
if (color[i] == 0 && !bfs(i))
{
cout << "no" << endl;
return 0;
}
}
cout << "yes" << endl;
return 0;
}