Algorithm

[백준] 알고리즘 1707번 - 이분 그래프 문제

낭강 2021. 1. 21. 22:00

#include<iostream>
#include<algorithm>
#include<vector>
#include<memory.h>
using namespace std;
vector<int> v1[20001];
int check[20001];
void dfs(int x) {
	int size = v1[x].size();
	for (int i = 0; i < size; i++) {
		if (check[v1[x][i]] == 0) {
			if (check[x] == 1) {
				check[v1[x][i]] = 2;
			}
			else {
				check[v1[x][i]] = 1;
			}
			dfs(v1[x][i]);
		}
	} 
}
int main() {
	int T;
	cin >> T;
	while (T--) {
		int v, e;
		cin >> v >> e;
		for (int i = 0; i < e; i++) {
			int x, y;
			cin >> x >> y;
			v1[x].push_back(y);
			v1[y].push_back(x);
		}
		for (int i = 1; i <= v; i++) {
			if (check[i] == 0) {
				check[i] = 1;
				dfs(i);
			}
		}
		bool flag = true;
		for (int i = 1; i <= v; i++) {
			for (int j = 0; j < v1[i].size(); j++) {
				if (check[i] == check[v1[i][j]]) {
					flag = false;
					break;
				}
			}
		}
		if (flag == true) cout << "YES" << "\n";
		else cout << "NO" << "\n";
		for (int i = 1; i <= v; i++) {
			v1[i].clear();
			check[i] = 0;
		}
	}
}
구현방식
1. 상대 노드가 방문을 안했으면?? 즉 check[v1[x][i]](상대 노드)
if( 현재 자기자신의 노드색깔(check[x])가 1이면 상대 노드를 2로 바꿔준다. )
else ( 자기자신의 노드색깔이 2이면 상대 노드를 1로 바꿔준다.)
2. dfs(상대 노드) -> 만약 상대 노드를 방문했을 시 무시한다.

구현방식부분만 이해한다면, 해결할 수 있습니다.

저도 한참 고민하다 풀었네요

DFS, BFS 문제는 꾸준함이 필요한거 같습니다.