BOJ 17352 - 여러분의 다리가 되어드리겠습니다! (Python)

조민수·2024년 3월 11일
0

BOJ

목록 보기
21/64
post-custom-banner

G5, BFS


문제 설명

선린월드에는 N개의 섬이 있다. 섬에는 1, 2, ..., N의 번호가 하나씩 붙어 있다. 그 섬들을 N - 1개의 다리가 잇고 있으며, 어떤 두 섬 사이든 다리로 왕복할 수 있다.

어제까지는 그랬다.

"왜 다리가 N - 1개밖에 없냐, 통행하기 불편하다"며 선린월드에 불만을 갖던 욱제가 다리 하나를 무너뜨렸다! 안 그래도 불편한 통행이 더 불편해졌다. 서로 왕복할 수 없는 섬들이 생겼기 때문이다. 일단 급한 대로 정부는 선린월드의 건축가를 고용해, 서로 다른 두 섬을 다리로 이어서 다시 어떤 두 섬 사이든 왕복할 수 있게 하라는 지시를 내렸다.

그런데 그 건축가가 당신이다! 안 그래도 천하제일 코딩대회에 참가하느라 바쁜데...

입력

첫 줄에 정수 N이 주어진다. (2 ≤ N ≤ 300,000)

그 다음 N - 2개의 줄에는 욱제가 무너뜨리지 않은 다리들이 잇는 두 섬의 번호가 주어진다.

출력

다리로 이을 두 섬의 번호를 출력한다. 여러 가지 방법이 있을 경우 그 중 아무거나 한 방법만 출력한다.

입력 예시

4
1 2
1 3

출력 예시

1 4

풀이

point변수를 통해 두 구역으로 나뉘는 node들을 묶어준다.
point값이 다른 두 node를 찾아서 출력하면 해결

from sys import stdin
from collections import deque

n = int(stdin.readline())
graph = [[] for _ in range(n + 1)]
visited = [0] * (n + 1)

point = 1

if n == 2:
    print("1 2")
    exit(0)

for _ in range(n - 2):
    a, b = map(int, stdin.readline().split())
    graph[a].append(b)
    graph[b].append(a)

def bfs(s):
    global point
    q = deque()
    q.append(s)
    visited[s] = point

    while q:
        now = q.popleft()

        for node in graph[now]:
            if not visited[node]:
                visited[node] = point
                q.append(node)

for i in range(1, n + 1):
    if not visited[i]:
        bfs(i)
    point += 1

res = []
for num in visited[1:]:
    if len(res) == 0:
        res.append(num)
    else:
        if num != res[0]:
            res.append(num)
            break

print(*res)
profile
사람을 좋아하는 Front-End 개발자
post-custom-banner

0개의 댓글