Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- C언어
- Cleancode
- BFS
- Algorithm
- C
- BOJ
- web
- Math
- BASIC
- 인프런
- 따배씨
- graph
- 종만북
- Algospot
- server
- JavaScript
- sorting
- udemy
- 생활코딩
- php
- String
- 백준
- DP
- greedy
- 정수론
- 따라하면서 배우는 C언어
- Python
- programmers
- 따라하며 배우는 C언어
- dfs
Archives
- Today
- Total
몽상실현개발주의
[BOJ] 1167 / 트리의 지름 / Python 파이썬 본문
[BOJ] 1167 / 트리의 지름 / Python 파이썬
https://www.acmicpc.net/problem/1167
풀이
Tree 의 지름을 구하는 문제이다.
문제를 선형시간안에 풀기위해서는 Tree 의 지름과 구하는 알고리즘에 대한 사전 지식이 필요하였다.
- Tree 의 지름 : 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로
- 선형 시간내에 Tree 의 지름을 구하는 Algorithm
- 트리에서 임의의 정점 xx를 잡는다.
- 정점 xx에서 가장 먼 정점 yy를 찾는다
- 정점 yy에서 가장 먼 정점 zz를 찾는다.
하나의 함수로 입력값의 개수에 따라 가장 먼 정점과 정점 사이의 거리를 반환하게 하였다.
- 입력값이 node 하나 -> 가장 먼 거리의 node 반환
- 입력값이 node 두개 -> 두 node 사이의 거리 반환
import sys
from collections import deque
input = sys.stdin.readline
def BFS(start, finish=0):
global N
dq = deque()
dq.append((start, 0))
res = [0, 0]
visited = [0] * (N+1)
while dq:
f, add = dq.popleft()
visited[f] = 1
for info in graph[f]:
t = info[0]
l = info[1]
if t == finish:
return add+l
if visited[t]:
continue
if res[1] < add + l:
res = [t, add+l]
dq.append((t, add+l))
return res[0]
N = int(input())
graph = [[] for _ in range(N+1)]
for _ in range(N):
ins = list(map(int, input().split()))
cnt = 1
while True:
if ins[cnt] == -1:
break
if not cnt % 2:
graph[ins[0]].append((ins[cnt-1], ins[cnt]))
cnt += 1
u = BFS(1)
v = BFS(u)
print(BFS(u, v))
참고블로그
'Algorithm PS > BOJ' 카테고리의 다른 글
[BOJ] 1654 / 랜선 자르기 / Python 파이썬 (0) | 2021.06.16 |
---|---|
[BOJ] 1967 / 트리의 지름 / Python 파이썬 (0) | 2021.06.16 |
[BOJ] 11725 / 트리의 부모 찾기 / Python 파이썬 (0) | 2021.06.14 |
[BOJ] 1991 / 트리 순회 / Python 파이썬 (0) | 2021.06.14 |
[BOJ] 2146 / 다리 만들기 / Python 파이썬 (0) | 2021.06.13 |
Comments