(기본적인 bfs, dfs문제 + 인접 노드별로 다른 색깔 할당)해주는 문제이다.
이분 그래프란 모든 꼭짓점을 빨강과 파랑으로 색칠하되, 모든 변이 빨강과 파랑 꼭짓점을 포함하도록 색칠할 수 있는 그래프이다.
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
queue <pair<int, char>> q; // blue : b, yellow : y
vector<vector<int>> v;
bool visited[20001];
char arr[20001];
int ans;
int K;
int V, E;
int a, b;
void bfs(int start) {
visited[start] = true;
arr[start] = 'r';
q.push({ start,'r'});
while (!q.empty()) {
int node = q.front().first;
char color = q.front().second;
q.pop();
if (color == 'r') { color = 'y'; }
else { color = 'r'; }
for (int i = 0; i < v[node].size(); i++) {
int next = v[node][i];
if (!visited[next]) {
visited[next] = true;
q.push({ next,color });
arr[next] = color;
}
}
}
}
void init() {
ans = 1;
v.resize(V+1); // V+1;체크하기
for (int i = 0; i < E; i++) {
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
memset(visited, 0, sizeof(visited));
}
int check() {
for (int i = 1; i <= V; i++) {
int v_size = v[i].size();
for (int j = 0; j < v_size; j++) {
int next = v[i][j];
if (arr[i] == arr[next]) { return 0; }
}
}
return 1;
}
int main() {
ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
cin >> K;
while (K--) {
cin >> V >> E;
init();
for (int i = 1; i <= V; i++) {
if (!visited[i]) {bfs(i);}
}
if (check()) { cout << "YES"<<'\n';}
else {cout << "NO"<<'\n';}
v.clear();
}
return 0;
}
vector<vector<int>> v;
vector<int> v[20001];
- 놓친 점
vector<vector<int>> v;
초기화를할 때v.resize(V+1);
로 공간을 할당해주고 끝났을때는v.clear();
를 통해 초기화 해줘야한다.- memset을 쓰기위해서는
#include <cstring>