알고리즘
[C++] 백준 1707번 이분 그래프
J3SUNG
2019. 8. 20. 17:53
728x90
DFS, BFS 문제입니다.
주어진 그래프가 이분그래프인지 아닌지 확인하는 문제입니다.
이분그래프는 각 정점에 빨강과 초록을 대입하면 알기 쉽습니다.
이웃하는 정점이 같은 색이 아닐 경우 이분그래프라 할 수 있습니다.
검정색 정점의 경우 이웃하는 그래프가 빨강과 초록이므로 어떤 색도 올 수 없습니다.
이와 같은경우 이분그래프가 아닙니다.
DFS를 통해 색이 칠해져있지 않다면 (color == 0) 색을 넣어줍니다.
그리고 다음 위치에서는 전의 위치의 색을 파라미터로 보내서 다른 색으로 배치하게 합니다.
이를 반복하고
다음 탐색위치가 현재 위치의 색과 다르게 전부 칠하면 성공이며
색이 다른경우가 있다면 실패를 의미합니다.
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int n;
int success;
vector<int> vec[20010];
int color[20010];
void DFS(int a, int x)
{
if (success != 0) {
return;
}
if ((color[a] == 1 && x == 1) || (color[a] == 2 && x == 2)) {
success = -1;
return;
}
else if (color[a] != 0) {
return;
}
if (x == 2) {
color[a] = 1;
x = 1;
}
else if(x == 1) {
color[a] = 2;
x = 2;
}
for (int i = 0; i < vec[a].size(); ++i) {
DFS(vec[a].at(i), x);
}
}
int main(int argc, char *argv[])
{
int v, e;
int testcase;
cin >> testcase;
while (testcase--) {
success = 0;
cin >> v;
cin >> e;
for (int i = 1; i <= 20000; ++i) {
vec[i].clear();
}
memset(color, 0, sizeof(color));
for (int i = 0; i < e; ++i) {
int a, b;
cin >> a;
cin >> b;
vec[a].push_back(b);
vec[b].push_back(a);
}
for (int i = 1; i <= v; ++i) {
if (color[i] != 0) {
continue;
}
DFS(i, 2);
}
if (success == -1) {
cout << "NO" << endl;
}
else {
cout << "YES" << endl;
}
}
return 0;
}