https://www.acmicpc.net/problem/1707
그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램
K: 테스트 케이스의 개수
V, E: 그래프의 정점의 개수 V, 간선의 개수 E
f, t: 각 줄에 인접한 두 정점의 번호
adjList: 무방향 그래프
visited: 방문 처리 리스트
flag: 이분 그래프인지 확인하는 변수
bfs(): bfs 탐색
(입력 및 선언)
(bfs 함수)
방문하지 않은 노드 : 0
빨간색 그룹 : 1
파란색 그룹 : -1
인접한 노드와 다른 그룹이어야 이분 그래프가 성립한다.
만약 인접한 노드가 서로 같은 그룹이라면 이분 그래프가 될 수 없으므로 바로 False를 반환하는 것이 시간 복잡도 줄이는 데 도움
(최종 출력)
from collections import deque
import sys
k = int(sys.stdin.readline())
def bfs(start):
visited[start] = 1
bfsQueue = deque([start])
while bfsQueue:
curNum = bfsQueue.popleft()
for element in adjList[curNum]:
# 방문하지 않은 노드라면, 큐에 추가하고 상위 노드와 다른 그룹으로 편성
if visited[element] == 0:
bfsQueue.append(element)
visited[element] = -visited[curNum]
# 만약 이미 방문한 노드인데 같은 그룹이라면 False 리턴
elif visited[element] == visited[curNum]:
return False
return True
for _ in range(k):
v, e = map(int, sys.stdin.readline().split())
adjList = [[] for _ in range(v+1)]
visited = [0 for _ in range(v+1)]
for _ in range(e):
f, t = map(int, sys.stdin.readline().split())
adjList[f].append(t)
adjList[t].append(f)
flag = True
for i in range(1, v+1):
# 방문하지 않았다면 bfs 호출
if visited[i] == 0:
# result = bfs(i)
# if not result:
if not bfs(i):
flag = False
break
if flag:
print('YES')
else:
print('NO')
계속 시간 초과가 나서 해결하는 것이 어려웠다.
평소에 bfs는 매개변수로 처리를 안 했는데, 인자를 함수에 넘겨 주었고 sys를 사용해서 입력을 받았다.