chldkato

백준 1707 이분 그래프 (파이썬) 본문

백준

백준 1707 이분 그래프 (파이썬)

chldkato 2020. 2. 16. 21:53

https://www.acmicpc.net/problem/1707

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수 E(1≤E≤200,000)가 빈 칸을 사이에 두고 순서대로 주어진다. 각 정점에는 1부터 V까지 차례로 번호가 붙어 있다. 이어서 둘째 줄부터 E개의 줄에 걸쳐 간선에 대한 정보가 주어지는데, 각 줄에 인접한 두 정점의 번호가 빈 칸을 사이에 두고 주어

www.acmicpc.net

1. 맨 처음 bfs에 입력한 값은 1로 체크한다

2. 그 다음에 이동할 수 있는 지점은 현재 체크한 값에 -1을 곱하면서 이분한다

3. 만일 다음에 이동할 지점의 체크값과 현재 체크값이 같으면 이분할 수 없다는 뜻이므로 NO를 출력

from collections import deque

def bfs(x):
    q.append(x)
    c[x] = 1
    while q:
        x = q.popleft()
        for nx in a[x]:
            if c[nx] == 0:
                c[nx] = -1*c[x]
                q.append(nx)
            elif c[nx] == c[x]:
                return 1
    return 0

tc = int(input())
while tc:
    v, e = map(int, input().split())
    a = [[] for _ in range(v)]
    c = [0 for _ in range(v)]
    q = deque()
    for _ in range(e):
        x, y = map(int, input().split())
        a[x-1].append(y-1)
        a[y-1].append(x-1)
    ans = 0
    for i in range(v):
        if c[i] == 0:
            ans = bfs(i)
            if ans == 1:
                break
    if ans == 0:
        print("YES")
    else:
        print("NO")
    tc -= 1

Comments