2023-10-28-동국대SW역량강화캠프-4693. 이분 그래프
문제
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다.
그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.
입력
첫 줄에 그래프의 정점의 개수 V(1 ≤ V ≤ 20,000)와 간선의 개수 E(1 ≤ E ≤ 200,000)가 빈 칸을 사이에 두고 순서대로 주어진다.
각 정점에는 1부터 V까지 차례로 번호가 붙어 있다.
둘째 줄부터 E개의 줄에 걸쳐 간선에 대한 정보가 주어지는데, 각 줄에 인접한 두 정점의 번호가 빈 칸을 사이에 두고 주어진다.
출력
입력으로 주어진 그래프가 이분 그래프이면 YES, 아니면 NO를 출력한다.
예제 1 입력
3 2
1 3
2 3
예제 1 출력
YES
Source
v, e = map(int, input().split())
edge = [[] for _ in range(v + 1)]
color = [0 for _ in range(v + 1)]
flag = True
for i in range(e):
a, b = map(int, input().split())
edge[a].append(b)
edge[b].append(a)
def dfs(edge, v, c):
global flag
# 이미 방문한 정점을 다시 방문하는 경우
if(color[v] == c):
return
# 이미 다른 색깔이 할당된 정점을 다시 방문하는 경우
if(color[v] == 3 - c):
flag = False
return
color[v] = c
for u in edge[v]:
dfs(edge, u, 3 - c)
for i in range(1, v + 1):
# 방문하지 않은 정점이면
if(color[i] == 0):
dfs(edge, i, 1)
if(flag == True):
print("YES")
else:
print("NO")