반응형
문제
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다.
그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에 두고 순서대로 주어진다. 각 정점에는 1부터 V까지 차례로 번호가 붙어 있다. 이어서 둘째 줄부터 E개의 줄에 걸쳐 간선에 대한 정보가 주어지는데, 각 줄에 인접한 두 정점의 번호 u, v (u ≠ v)가 빈 칸을 사이에 두고 주어진다.
출력
K개의 줄에 걸쳐 입력으로 주어진 그래프가 이분 그래프이면 YES, 아니면 NO를 순서대로 출력한다.
제한
- 2 ≤ K ≤ 5
- 1 ≤ V ≤ 20,000
- 1 ≤ E ≤ 200,000
예제 입력 1
2
3 2
1 3
2 3
4 4
1 2
2 3
3 4
4 2
예제 출력 1
YES
NO
소스코드
from collections import deque
def bfs(x):
visit[x] = 1
queue = deque([x])
while queue:
f = queue.popleft()
for i in graph[f]:
if not visit[i]:
visit[i] = -visit[f]
queue.append(i)
elif visit[i] == visit[f]:
return False
return True
k = int(input())
for test in range(k):
v, e = map(int, input().split())
graph = [[] for _ in range(v+1)]
visit = [0] * (v+1)
cnt = 1
for i in range(e):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
result = "YES"
for i in range(1, v+1):
if not visit[i]:
if not bfs(i):
result = "NO"
break
print(result)
1. 1~n번 정점을 방문했는지 검사하고 아직 방문하지 않은 경우 아래 과정을 반복한다.
- 현재 정점을 색 1로 칠한다.
- bfs를 이용하여 현재 정점과 연결된 점들을 모두 색 -1로 칠한다. (만약 이미 방문한 정점인 경우 다시 칠하지 않는다.)
2. 색칠된 정점들에 대해 하나의 간선에 연결된 두 정점의 색이 다르면 YES, 색이 같으면 NO를 출력한다.
반응형
'코딩테스트 > DFS & BFS' 카테고리의 다른 글
[Python] 백준 2331번 : 반복수열 (0) | 2021.12.16 |
---|---|
[Python] 백준 10451번 : 순열 사이클 (0) | 2021.12.15 |
[Python] 백준 11724번 : 연결 요소의 개수 (0) | 2021.12.15 |
[Python] 백준 1260번 : DFS와 BFS (0) | 2021.12.14 |
[그래프 탐색 알고리즘] DFS/BFS (0) | 2021.10.20 |