728x90
시간 제한 2초, 메모리 제한 512MB
# 조건
- 적의 적은 친구 이론이란, A와 적대 관계인 B가 있고, B와 적대 관계인 C가 있을 때 A와 C는 우호 관계에 있다는 이론을 말한다.
- 하지만 이 이론에는 치명적인 단점이 있다.
- 바로 C와 적대 관계인 D가 있다면, A 역시 D와 적대관계가 되는 것이다.
- 하지만 또 생각해보면 D와 적대관계인 E가 있다면 E는 A, C와 우호 관계가 된다.
- 같은 맥락으로, B와 D 역시 우호 관계가 된다.
- 이 이론에 따라 친구를 사귀게 되면 적도 늘어나겠지만 어쨌거나 용재는 친구가 절실하다.
- 하지만 아직 이 이론은 전 우주상에서 엄밀히 증명된 적이 없다.
- 따라서 용재는 이론을 적용하기 전에 먼저 자신의 주위 N명에 관해서 이 이론이 성립하는지를 먼저 검증하고 싶다.
- 용재를 도와 이 이론이 성립할 수 있는지를 알아보자.
입력
- 첫 줄에 용재 주위 사람의 수 N(1 ≤ N ≤ 2,000)과 적대관계의 수 M(0 ≤ M ≤ 1,000,000)이 주어진다.
- 두 번째 줄부터 M개의 줄에 거쳐 서로 적대관계에 있는 사람의 번호 A, B(1 ≤ A, B ≤ N)가 주어진다.
출력
- 이론이 성립할 수 있다면 1, 그렇지 않다면 0을 출력하라.
# 접근 방법
- 이분 그래프, 그래프 탐색, 유니온 파인드 등 다양한 방법으로 풀 수 있는 문제이다.
- 나는 단순한 bfs를 이용하여 풀어주었다.
- 우선 입력받는 적의 관계를 양방향 그래프로 기록해주고 visted를 친구의 수 만큼 설정해준다.
- 1부터 순회하면서 방문한 적이 없다면 deque에 삽입해주고 bfs를 실행해준다.
- 현재 친구의 번호에서 연결된 노드들을 탐색하며 방문한 적이 없다면 visited[x] * -1을 해준다.
- 적의 적이라면 양수가 되어 친구가 되고, 아니라면 음수가 되어 적이 된다.
- 방문한 적이 있는데 이 때 visited[j] == visited[x]라면 즉, 연결되어 있는 노드가 나와 아군이라면 그 관계는 옳지 못하므로 종료해준다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from collections import deque
N, M = map(int, input().split())
graph = [[] for _ in range(N+1)]
visited = [0] * (N+1)
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
for i in range(1, N+1):
if not visited[i]:
q = deque()
q.append(i)
visited[i] = 1
while q:
x = q.popleft()
for j in graph[x]:
if not visited[j]:
visited[j] = visited[x] * (-1)
q.append(j)
elif visited[j] == visited[x]:
print(0)
exit(0)
print(1)
728x90
'ALGORITHM > DFS, BFS, 그래프 탐색' 카테고리의 다른 글
[백준 2583번] 파이썬, c++ - 영역 구하기 (1) | 2023.12.31 |
---|---|
[백준 3187번] 파이썬 - 양치기 꿍 (1) | 2023.12.27 |
[백준 1240번] 파이썬 - 노드사이의 거리 (0) | 2023.09.25 |
[백준 9466번] 파이썬 - 텀 프로젝트 (0) | 2023.09.18 |
[백준 15886번] 파이썬 - 내 선물을 받아줘2 (0) | 2023.09.15 |