풀이


이분그래프에 대한 개념을 배웠으며 인접리스트를 활용한 BFS 역시 연습한 문제이다.

이분그래프란 인접하는 정점들이 서로 다른 그룹일 경우에 이분그래프라고 한다.

입력값이 각 간선정보를 주기 때문에 인접리스트 l 를 선언하여 각 정점마다 인접한 정점들을 리스트에 담아준다.

이후 그룹핑을 위한 group 리스트를 선언해준 뒤 BFS 를 실행한다.

시작점을 그룹1로 구분한 뒤 인접한 정점들 중 그룹핑이 되지않은 정점들에게 그룹-1로 구분해준다.

이를 반복하다가 만약 인접한 정점 중 현재 정점과 같은 그룹일 경우 이분그래프가 아니기 때문에 False 값을 반환한다.

이후 BFS 를 통해 반환받은 값을 통해 이분그래프 여부를 판단한 뒤 출력조건에 맞게 출력하면된다.

소스코드


# 이분 그래프
from collections import deque
import sys
input = sys.stdin.readline
 
def bfs(k):
    group[k] = 1  # 시작점을 그룹1로 선언
    q = deque()
    q.append(k)
    while q:
        x = q.popleft()
        for i in l[x]:  # x와 인접한 정점들 중
            if group[i] == 0:  # 그룹핑이 안되어있을 경우
                group[i] = -group[x]  # 그룹-1로 선언
                q.append(i)
            elif group[i] == group[x]:  # 인접한 정점인데 같은 그룹일 경우 이분그래프가 아님
                return False
    return True
 
for t in range(int(input())):
    v, e = map(int, input().split())
    l = [[] for _ in range(v+1)]  # 인접리스트 선언
    group = [0] * (v+1)  # 두개의 그룹으로 나누기
    isBin = True
 
    for _ in range(e):
        a, b = map(int, input().split())  # 인접리스트로 저장
        l[a].append(b)
        l[b].append(a)
 
    for k in range(1, v+1):
        if group[k] == 0:  # 아직 그룹핑이 안된 정점들일 경우
            if not bfs(k):
                isBin = False
                break
 
    print("YES" if isBin else "NO")

References