알고리즘/BOJ

[BOJ/python]1707번 이분 그래프

frog-in-well 2022. 8. 30. 20:24

백준 1707번 이분 그래프 파이썬

문제 링크 - https://www.acmicpc.net/problem/1707

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에

www.acmicpc.net

두 개의 그룹으로 노드를 나누고, 하나의 그룹의 노드끼리 연결되지 않도록 해야 한다. 문제를 보자마자 간단한 분리 집합 문제라고 생각했다. 하나의 노드를 기준으로 설정하고, 연결된 노드들을 모두 union 한다. 이 때 같은 부모를 가지는 집합에서 연결된 노드가 있다면 ‘NO’를 출력한다. 하지만 굳이 union을 할 필요 없이 BFS만으로도 간단히 풀 수 있다.

1. 풀이

  • 방문하지 않은 모든 정점을 시작점으로 BFS를 실행한다.
  • 방문 표시를 1,-1로 나누어 그룹을 구분한다.
  • 현재 노드를 방문 처리하고, 연결된 노드들은 다른 숫자로 방문 처리한다.
  • 만약 다음 노드가 이미 방문 처리 되었고, 현재 노드와 같은 숫자로 표시되었다면 ‘NO’를 반환한다.

2. 코드

from collections import deque
import sys
input = sys.stdin.readline

def BFS(G):
    visited = [0 for _ in range(V+1)]
    for i in range(1,V+1):
        if visited[i]==0:
            q = deque([i])
            visited[i]=1
            while q:  
                node = q.popleft()
                
                nodeTeam = visited[node]
                nextTeam = nodeTeam*-1
                for next in G[node]:
                    if visited[next]==0:
                        visited[next] = nextTeam
                        q.append(next)
                                
                    elif visited[next] == nodeTeam:
                        return 'NO'
    return 'YES'

T = int(input())
for _ in range(T):
    answer='YES'
    
    V,E = map(int,input().split())
    # graph = [[0 for _ in range(V+1)] for _ in range(V+1)]
    G = [ [] for _ in range(V+1)]

    for i in range(E):
        u,v = map(int, input().split())
        G[u].append(v)
        G[v].append(u)
        
    answer = BFS(G)
    print(answer)