BOJ 1707 이분 그래프


사용한 알고리즘

  • BFS

알고리즘 설명

  • 하나의 연결 그래프에서 서로 이분 그래프 형태로 존재하기 위한 조건은 아래와 같다.
  • root에서 BFS로 내려가는 경우, depth 차이가 짝수인 정점과 연결되어 있으면 안된다.
  • 위 조건이 없다면 가능하다.
  • cnt값을 visited 배열의 저장하여 이를 확인하였다.

풀이

// baekjoon 1707 yechan
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

vector<vector<int> > adj;
vector<int> visited;

int cnt;

bool bfs(int start) {
	int component = cnt;
	visited[start] = cnt;
	queue<int> q;
	q.push(start);
	while (q.size()) {
		int qSize = q.size();
		while (qSize--) {
			int curr = q.front(); q.pop();
			for (int next : adj[curr]) {
				if (!visited[next]) {
					visited[next] = cnt+1;
					q.push(next);
				}
				else if (component <= visited[next] && visited[next] != cnt+1) {
					if ((visited[next]-visited[curr])%2 == 1 || (cnt+1-visited[next])%2 == 1) {
						return false;
					}
				}
			}
		}
		cnt++;
	}
	return true;
}

int main() {
	int K, V, E, a, b;
	scanf("%d", &K);
	while (K--) {
		scanf("%d", &V);
		adj = vector<vector<int> >(V+1);
		visited = vector<int>(V+1, 0);
		scanf("%d", &E);
		for (int i=0; i<E; i++) {
			scanf("%d%d", &a, &b);
			adj[a].push_back(b);
			adj[b].push_back(a);
		}
		cnt=1;
		bool ret = true;
		for (int i=1; i<=V; i++) {
			if (!visited[i]) {
				ret = bfs(i);
			}
			if (!ret) break;
		}
		if (!ret) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}



© 2020.08. by fbdp1202

Powered by theorydb