문제
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다. 그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.
input
2
3 2
1 3
2 3
4 4
1 2
2 3
3 4
4 2
output
YES
NO
import sys
from collections import deque
def bfs(x):
q = deque()
tmp = deque()
visited[x] = True
partition[x] = 1
for i in arr[x]:
visited[i] = True
partition[i] = -1
q.append(i)
while q:
for y in q:
for i in arr[y]:
if not visited[i]:
visited[i] = True
partition[i] = -1 * partition[y]
tmp.append(i)
else:
if partition[i] == partition[y]:
return True
q = tmp
tmp = []
return False
input = sys.stdin.readline
K = int(input().strip())
for _ in range(K):
v, e = map(int, input().split())
arr = [[] for _ in range(v + 1)]
partition = [0 for _ in range(v + 1)]
visited = [False for _ in range(v + 1)]
flag = False
for i in range(e):
x, y = map(int, input().split())
arr[x].append(y)
arr[y].append(x)
for i in range(v + 1):
if not visited[i] and bfs(i):
flag = True
break
if flag:
print('NO')
else:
print('YES')
이분 그래프라는 개념을 처음 알게 되었다. 한 테스트케이스에 여러 연결 요소(connected componet)가 있을 수 있는지에 대한 설명이 있으면 좋을 것 같다.