1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
문제
트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.
입력
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다.
먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.
출력
첫째 줄에 트리의 지름을 출력한다.
코드
from collections import deque
v = int(input()) # 트리의 정점의 개수
# 트리 정보 입력
tree = [[] for _ in range(v + 1)]
for _ in range(v):
info = list(map(int, input().split()))
for i in range(1, len(info)-1, 2):
tree[info[0]].append((info[i], info[i+1]))
# 풀이 방법
# 1. 어떤 정점 x에서 가장 먼 정점 y를 찾는다
# 2. y에서 가장 먼 정점 z를 찾는다
def bfs(graph, start):
max_vertex = 0
max_dist = 0
q = deque([(start, 0)])
visited = [False] * (len(graph))
visited[start] = True # 시작 정점 방문 처리
while q:
now_v, now_c = q.popleft()
for nx_v, nx_c in graph[now_v]:
if not visited[nx_v]:
q.append((nx_v, now_c + nx_c))
visited[nx_v] = True
if max_dist < now_c + nx_c:
max_dist = now_c + nx_c
max_vertex = nx_v
return [max_vertex, max_dist]
y, y_dist = bfs(tree, 1)
z, z_dist = bfs(tree, y)
print(z_dist)
처음에는 플로이드 워셜로 모든 경로 간 거리 다 구해서 해볼까 잠깐 생각했는데 조건 보니까 정점 개수가 최대 10,000개까지 들어온대서 바로 포기했다. 뭔가 특별한 방법이 있을거 같아 찾아보니 다음과 같이 구해야하는 것이었다.
1. 트리에서 어떤 정점 x를 잡고 그 정점에서 가장 먼 정점 y를 찾는다.
2. 정점 y에서 가장 먼 정점 z를 찾는다.
3. y에서 z까지의 거리가 문제에서 요구하는 트리의 지름이다.
처음보면 이게 무슨 말인가 싶겠지만 다음의 블로그에 아주 설명이 잘 되어있다.
트리의 지름 구하기
트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를
blog.myungwoo.kr
'문제풀이 > 그래프' 카테고리의 다른 글
[Python/파이썬] 백준 1976번 여행 가자 (0) | 2022.09.22 |
---|---|
[Python] 백준 4386번 별자리 만들기 (0) | 2022.08.17 |
[Python] 백준 1647번 도시 분할 계획 (0) | 2022.08.09 |
[Python] 백준 1197번 최소 스패닝 트리 (0) | 2022.08.08 |
[Python] 백준 2263번 트리의 순회 (0) | 2022.07.28 |
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
문제
트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.
입력
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다.
먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.
출력
첫째 줄에 트리의 지름을 출력한다.
코드
from collections import deque v = int(input()) # 트리의 정점의 개수 # 트리 정보 입력 tree = [[] for _ in range(v + 1)] for _ in range(v): info = list(map(int, input().split())) for i in range(1, len(info)-1, 2): tree[info[0]].append((info[i], info[i+1])) # 풀이 방법 # 1. 어떤 정점 x에서 가장 먼 정점 y를 찾는다 # 2. y에서 가장 먼 정점 z를 찾는다 def bfs(graph, start): max_vertex = 0 max_dist = 0 q = deque([(start, 0)]) visited = [False] * (len(graph)) visited[start] = True # 시작 정점 방문 처리 while q: now_v, now_c = q.popleft() for nx_v, nx_c in graph[now_v]: if not visited[nx_v]: q.append((nx_v, now_c + nx_c)) visited[nx_v] = True if max_dist < now_c + nx_c: max_dist = now_c + nx_c max_vertex = nx_v return [max_vertex, max_dist] y, y_dist = bfs(tree, 1) z, z_dist = bfs(tree, y) print(z_dist)
처음에는 플로이드 워셜로 모든 경로 간 거리 다 구해서 해볼까 잠깐 생각했는데 조건 보니까 정점 개수가 최대 10,000개까지 들어온대서 바로 포기했다. 뭔가 특별한 방법이 있을거 같아 찾아보니 다음과 같이 구해야하는 것이었다.
1. 트리에서 어떤 정점 x를 잡고 그 정점에서 가장 먼 정점 y를 찾는다.
2. 정점 y에서 가장 먼 정점 z를 찾는다.
3. y에서 z까지의 거리가 문제에서 요구하는 트리의 지름이다.
처음보면 이게 무슨 말인가 싶겠지만 다음의 블로그에 아주 설명이 잘 되어있다.
트리의 지름 구하기
트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를
blog.myungwoo.kr
'문제풀이 > 그래프' 카테고리의 다른 글
[Python/파이썬] 백준 1976번 여행 가자 (0) | 2022.09.22 |
---|---|
[Python] 백준 4386번 별자리 만들기 (0) | 2022.08.17 |
[Python] 백준 1647번 도시 분할 계획 (0) | 2022.08.09 |
[Python] 백준 1197번 최소 스패닝 트리 (0) | 2022.08.08 |
[Python] 백준 2263번 트리의 순회 (0) | 2022.07.28 |