Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 1707 이분 그래프

정글러 2021. 11. 23. 00:15
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**8)

def DFS(v) :
    global flag
    for next in V[v] :
        if C[next] == 0 :
            C[next] = - C[v]
            DFS(next)
        elif C[next] == C[v] :
            flag = False

k = int(input())
for i in range(k) :
    Vn, En = map(int, input().split())
    V = [[] for i in range(Vn + 1)]
    C = [0 for i in range(Vn + 1)]
    for i in range(En) :
        v1, v2 = map(int, input().split())
        V[v1].append(v2)
        V[v2].append(v1)

    flag = True
    i = 0
    while flag and i < Vn :
        i = i + 1
        if C[i] == 0 :
            C[i] = 1
            DFS(i)
    if flag :
        print('YES')
    else :
        print('NO')

점과 선의 수를 인풋받고,각각의 선을 따라 점의 연결정보를 V에 기록한다.

각 점이 이분집합의 어느 부분에 속할건지 기록하는 리스트 C를 만든다. (왼쪽 1, 오른쪽 -1, 미방문 0)

DFS의 실행점 now와 연결된 모든 점 next에 대해, C[next]가 아직 0이라면 now와 반대편 집합에 넣고 재귀한다.

재귀 중 now와 next가 같은 이분집합에 속하는 경우가 생긴다면 반복을 종료하고 NO를 출력한다.

그렇지 않고 모든 점을 다 1과 -1의 두 집합에 양분했다면 YES를 출력한다.