1707: 이분 그래프
입력은 여러 테스트 케이스로 구성되며 테스트 케이스의 수 K가 첫 번째 줄에 제공됩니다. 각 테스트 케이스의 첫 번째 줄에는 그래프의 정점 수 V와 간선 수 E가 공백으로 입력됩니다.
www.acmicpc.net
한동안 고민하던 문제…
#include <bits/stdc++.h>
using namespace std;
int check(20001);
int flag; // 0 : NO , 1 : YES
vector<vector<int> > graph(20001);
// div : 1 or 2
void dfs(int vertex, int div) {
if(flag == 0) {
return;
}
int size = graph(vertex).size();
check(vertex) = div;
for(int i = 0; i < size; i++) {
if(check(graph(vertex)(i)) == 0) {
if(div == 1) {
dfs(graph(vertex)(i), 2);
}
else {
dfs(graph(vertex)(i), 1);
}
}
else if(check(graph(vertex)(i)) == div) {
flag = 0;
return;
}
}
}
int main(void) {
int K, V, E;
cin >> K;
for(int i = 0; i < K; i++) {
fill_n(check, 20001, 0);
flag = 1;
cin >> V >> E;
for(int j = 1; j <= V; j++) {
graph(j).clear();
}
for(int j = 0; j < E; j++) {
int first, second;
cin >> first >> second;
graph(first).push_back(second);
graph(second).push_back(first);
}
for(int j = 1; j <= V; j++) {
if(check(j) == 0 && flag == 1) {
dfs(j, 1);
}
}
if(flag == 1 || V == 1) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
}
}
문제는 간단해 보인다.
DFS와 BFS로 할 수 있다고 하는데 저는 DFS로 했습니다.
check라는 배열에 0, 1, 2를 넣었는데 각각 의미가 다릅니다.
0 : 아직 검색되지 않음.
1, 2: 인접한 정점이 다른지 확인하기 위해 검색하여 번호를 부여했습니다.
중요한 점은 그래프가 전혀 연결되어 있지 않은지 확인하기 위해서는 check array를 하나씩 확인하면서 0이 있으면 dfs를 실행한다는 것이다. 또한 두 개의 분리된 그래프가 있을 때 첫 번째 그래프는 이분 그래프가 아닌 경우 플래그로 확인합니다.
플래그가 0이면 추가 dfs를 수행할 필요가 없습니다.
제가 길을 잃은 이유는 초기화를 계속 이상하게 해서…
보조 벡터를 초기화하는 과정에서 for 문은 나는 <= V 깁스 나는 < V 적어놨는데..몰랐네요..
어…
(6%에서 틀리면 초기화를 확인하세요.)