

......죄송합니다.

def check(graph):
N = len(graph) - 1 # 노드 수
# 방문하지 않은 경우 False
# 방문한 경우 'A' or 'B'
visited = [False] * (N + 1)
# 뒷 코드에서 계속
visited 배열은 방문 여부와 집합 정보를 함께 저장합니다.FalseA or Bdef check(graph):
# 앞 코드에서 이어짐
def bfs(x):
queue = deque([x])
visited[x] = 'A' # 시작 노드는 집합 A로 분류
while queue:
i = queue.popleft()
for j in graph[i]:
# 인접 노드 중 미방문한 노드
if not visited[j]:
# 현재 노드가 'A'면 인접 노드는 'B'로
# 현재 노드가 'B'면 인접 노드는 'A'로 분류해야 함
flag = 'B' if visited[i] == 'A' else 'A'
visited[j] = flag
queue.append(j)
# 인접 노드 중 동일 집합의 노드가 존재
elif visited[j] == visited[i]:
return False
return True
# 뒤 코드로 이어짐
bfs 함수는 큐에서 팝한 노드 i와 인접한 노드 j를 확인할 때j가 미방문 노드인 경우i가 A면, 인접 노드 j는 B로i가 B면, 인접 노드 j는 A로 분류합니다.j가 이미 방문한 노드인데, i와 동일 집합으로 분류된 경우i, j가 동일 집합에 속하니False를 반환합니다.def check(graph):
# 앞 코드에서 이어짐
for i in range(1, N + 1):
if not visited[i]:
# 이분 그래프를 만들 수 없는 경우 False 반환
if not bfs(i):
return False
return True
1부터 N+1까지 for문을 돌리고, 방문하지 않은 노드인 경우 bfs를 수행하여 연결된 노드들을 방문 처리하게끔 구현했습니다.from collections import deque
import sys
input = sys.stdin.readline
def check(graph):
N = len(graph) - 1 # 노드 수
# 방문하지 않은 경우 False
# 방문한 경우 'A' or 'B'
visited = [False] * (N + 1)
def bfs(x):
queue = deque([x])
visited[x] = 'A' # 시작 노드는 집합 A로 분류
while queue:
i = queue.popleft()
for j in graph[i]:
# 인접 노드 중 미방문한 노드
if not visited[j]:
# 현재 노드가 'A'면 인접 노드는 'B'로
# 현재 노드가 'B'면 인접 노드는 'A'로 분류해야 함
flag = 'B' if visited[i] == 'A' else 'A'
visited[j] = flag
queue.append(j)
# 인접 노드 중 동일 집합의 노드가 존재
elif visited[j] == visited[i]:
return False
return True
for i in range(1, N + 1):
if not visited[i]:
# 이분 그래프를 만들 수 없는 경우 False 반환
if not bfs(i):
return False
return True
K = int(input())
for _ in range(K):
V, E = map(int, input().split())
graph = [[] for _ in range(V + 1)]
for _ in range(E):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
if check(graph):
print("YES")
else:
print("NO")