이 문제에 대한 상세 설명은 알고리즘 :: 백준 :: DFS :: 1707:: 이분 그래프 (velog.io)에 있습니다. 이번에는 같은 문제를 조금 더 효율적으로 풀어보겠습니다.
0
을 방문하지 않은 점, 1
을 그룹 A, 2
를 그룹 B라고 가정하고 state[]
배열을 선언합니다.state
가 x
일 때 다음 정점의 state
는 3-x
입니다. (1 → 2, 2 → 1)state
가 같디면 이분그래프가 아닌 것을 확인할 수 있습니다.#include <iostream>
#include <vector>
using namespace std;
bool ans;
int K, V, E, state[20001];
vector<int> graph[20001];
void dfs(int cv, int s) {
state[cv] = s;
for (int nv : graph[cv]) {
// 방문하지 않은 정점에 대해 반대 그룹 표시
if (!state[nv]) dfs(nv, 3 - s);
// 방문된 정점에 대해 같은 그룹 여부 확인
if (state[nv] == state[cv]) { ans = true; break; }
}
}
void solve() {
// 모든 정점에 대해 dfs를 수행함.
for (int i = 1; i <= V; ++i) {
if (!state[i]) dfs(i, 1);
if (ans) break; // 이분그래프가 아닌 경우
}
}
void clear() {
ans = false;
fill(state, state + V + 1, false);
for (int i = 1; i <= V; ++i) graph[i].clear();
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> K;
while (K--){
cin >> V >> E;
int sv, ev;
for (int i = 0; i < E; ++i) {
cin >> sv >> ev;
// 무방향 그래프
graph[sv].push_back(ev);
graph[ev].push_back(sv);
}
solve();
ans ? cout << "NO\n" : cout << "YES\n";
clear(); // 다음 loop를 위한 초기화 과정
}
}