문제 출처
1. 문제설명
2. 알고리즘 설계
- 이분 그래프는 well-known 알고리즘이다.
- 정점을 어떤 색으로 칠한다.
- 본인 코드에서는 칠해져 있지 않은 경우 0, 그렇지 않은 경우 -1 또는 1이다.
- 프로세스
- 처음 시작점(인접 행렬에서는 1번째)을 1로 칠한다.
- 연결된 정점의 색을 칠한다.
- 만약 이미 색이 칠해져 있는데, 시작점과 연결된 점이 같은 색이면 절대 이분 그래프가 될 수 없다.
- 큐에 삽입한다.
- 큐에서 꺼낸 정점은 (현재 색 * -1)을 취해 칠하는데, 위와 똑같은 검사를 진행한다.
- 마지막 까지 될 수 없는 조건에 걸리지 않는다면 이분 그래프이다.
3. 전체 코드
#include <bits/stdc++.h>
using namespace std;
const int SZ = 20005;
int K, V, E, u, v;
vector<int> adj[SZ];
vector<int> color;
bool bfs() {
color.assign(V+5, 0);
for(int i=1; i<=V; i++) {
if(color[i] != 0) continue;
queue<int> q;
q.push(i);
color[i] = 1;
while(!q.empty()) {
int cur = q.front();
q.pop();
for(int nxt : adj[cur]) {
if(color[nxt] != 0) {
if(color[nxt] == color[cur]) return false;
else continue;
}
color[nxt] = color[cur] * -1;
q.push(nxt);
}
}
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> K;
while(K--) {
cin >> V >> E;
for(int i=1; i<=V; i++)
adj[i].clear();
while(E--) {
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
cout << (bfs() ? "YES" : "NO") << '\n';
}
return 0;
}