개발/algorithm
[백준 1167번] 트리의 지름 - python
zzi_on2
2022. 3. 11. 16:15
문제 링크
https://www.acmicpc.net/problem/1167
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
풀이
- 백준 1967번 트리의 지름 문제를 풀었어서 해당 아이디어 사용해서 풀었다.
https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
- 다익스트라 알고리즘 사용
1. 루트 노드에서 다른 노드까지의 거리를 구한 후 가장 긴 거리를 가진 노드 찾는다.
2. 해당 노드에서 다른 노드까지의 거리 중 가장 긴 거리를 출력한다.
import heapq
import sys
input = sys.stdin.readline
# 다익스트라 알고리즘
def dijkstra(start):
distance = [INF] * (v+1)
distance[start] = 0
q = []
heapq.heappush(q,(0,start))
while q :
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost,i[0]))
return distance[1:]
v = int(input())
INF = int(1e9)
graph = [ [] for _ in range(v+1) ]
for _ in range(v):
s = list(map(int,input().split()))
index = 1
while True:
if s[index] == -1 :
break
# 노드 번호, 노드까지의 거리
b, c = s[index], s[index+1]
# 트리 추가
graph[s[0]].append((b,c))
graph[b].append((s[0],c))
index += 2
# 1번 노드에서 다른 노드까지의 거리 구하기
dist = dijkstra(1)
# 가장 거리가 긴 노드의 번호
tmp = dist.index(max(dist))
# 해당 노드에서 다른 노드까지의 거리 중 가장 긴 거리 출력
print(max(dijkstra(tmp+1)))