๋ฌธ์ ๋งํฌ
1167๋ฒ: ํธ๋ฆฌ์ ์ง๋ฆ
๋ฌธ์ ์์ฝ
ํธ๋ฆฌ๋ ์ฌ์ดํด ์์ด ๋ชจ๋ ์ ์ ์ด ์ฐ๊ฒฐ๋ ๊ทธ๋ํ์ด๋ค. ์ ์ ์ ๊ฐฏ์ V(1<=V<=10.0000)๊ฐ ์ ๋ ฅ๋ ํ, ๊ฐ ์ ์ ๋ณ๋ก ๊ฐ์ ์ ์ ๋ณด(์ฐ๊ฒฐ ์ ์ , ๊ฑฐ๋ฆฌ)๊ฐ ์ ๋ ฅ๋๋ค. ํ ์ ์ ์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ์ฌ๋ฌ ๊ฐ์ผ ์ ์๋ค. ์ด ๋ ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ๋ผ. ํธ๋ฆฌ์ ์ง๋ฆ์ ๋ ์ ์ ๊ฐ ๊ฑฐ๋ฆฌ์ ์ต๋๊ฐ์ด๋ค.
ํ์ด ์ค๋ช
๋ชจ๋ ์ ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ํ, ์ต๋๊ฐ์ ์ป๋ ๋ฐฉ๋ฒ
28๋ถ์ ์์ ์ด๊ธฐ ์ฝ๋๋ฅผ ์ ์ถํ์๊ณ , ๊ฒฐ๊ณผ๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ์๋ค. ์ดํ, ๊ตฌํํ ์ฝ๋๊ฐ ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ์ด๊ณ ์๊ฐ ๋ณต์ก๋๋ ๊ณ์ฐํ์ ๋, ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก O(N^3), ๊ณต๊ฐ ๋ณต์ก๋๋ 2์ฐจ์ ๋ฆฌ์คํธ๊ฐ 10,000,000,000(100์ต) index์ ๊ณต๊ฐ์ ์ฐจ์งํด์ผํ๋๋ฐ, Python์์ 1์ฐจ์ list๊ฐ 2์ต ๊ฐ ์ ๋์ index๊น์ง ๋ค๋ฃฐ ์ ์๋ค๋ ๊ธ์ ๋ณด์์ ๋, ์ฌ๋ฌ๋ชจ๋ก ๋ฌธ์ ํด๊ฒฐ์ด ๋ถ๊ฐ๋ฅํ ์ฝ๋์ด๊ธด ํ์๋ค.
์ฝ๋
import sys
input=sys.stdin.readline
V=int(input().rstrip())
graph=[[] for _ in range(V+1)]
for _ in range(V):
row=list(map(int, input().rstrip().split()))
start=row[0]
for i in range(1, len(row), 2):
if row[i]==-1:
break
elif row[i]>0:
graph[start].append((row[i], row[i+1]))
dists=[[-1 for _ in range(V+1)] for _ in range(V+1)]
for i in range(1, V+1):
dists[i][i]=0
for i in range(1, V+1):
while graph[i]:
end, dist=graph[i].pop()
if dists[i][end]<dist:
dists[i][end]=dist
for j in range(1, V+1):
if i!=j and dists[end][j]>0:
dists[i][j]=dists[i][end]+dists[end][j]
diameter=-1
for i in range(1, V+1):
diameter=max(diameter, max(dists[i]))
print(diameter)
๋ฒ์ธ๋ก, ์ด ๋ฌธ์ ๋ณด๋ค ๋ ์ด๋ ค์ด ๋ฌธ์ ๋ฅผ ํ ์ ์๊ฒ ๋๋ฉด, ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์๋ก์ด ํ์ด๋ฅผ ๋ง๋ค์ด๋ณผ ์๋ ์์ง ์์๊น, ๊ทธ ํ์ด๊ฐ ํ๋ก์ด๋์ ์์ ์จ์ฒ๋ผ ์์ ์ ์ด๋ฆ์ด ๋ค์ด๊ฐ ์๊ณ ๋ฆฌ์ฆ์ด ๋ ์ ์๋ค๋ ์ฌ์ค์ ๊ต์ฅํ ๋์ด ์ด๋กฑํด์ง๋ค! (ใ ใ ใ ) ๐
์๊ฐ ๋ณต์ก๋ O(N^3): ๊ฐ๊ฐ์ ๊ฐ์ ์ ๋ณด (start, end)์ ๋ํด for i in range(N)๋ก ์ํํ๋ฉฐ, i!=end์ธ i๋ฅผ ์ฐพ์ [i][end]=[i][start]+[start][end]๋ฅผ ํ ๋นํด์ผํ๊ณ , ๊ฐ๊ฐ์ ๊ฐ์ ์ ๋ณด๋ N^2๊ฐ ์์ผ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ O(N^3)์ด ๋๋ค.
ํธ๋ฆฌ ์ง๋ฆ์ ์ฑ์ง ํ์ฉํ ํ์ด
์์ ์ฒซ ๋ฒ์งธ ํ์ด๋ฅผ ์๊ฐํ๊ณ . ๊ตฌํํด์ ๋ต ์ ์ถํ๋ ๋ฐ๊น์ง 28๋ถ ์ ๋ ๊ฑธ๋ ธ๊ณ , ์ดํ์ 36๋ถ๊น์ง ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ+์๊ฐ ์ด๊ณผ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด๋ณด์์ง๋ง, ๋ง๋ ํ ์์ด๋์ด๊ฐ ์๊ฐ๋์ง ์์ ๋ต ์ฝ๋๋ฅผ ๊ฒ์ํ์๋ค.
ํ์ด์ ํต์ฌ์ ํธ๋ฆฌ์ ์ฑ์ง์ ํ์ฉํ๋ ๊ฒ์ด๋ค. ๊ทธ ์ฑ์ง์ ์๋์ ๊ฐ๋ค.
์์์ ์ ์ ์์ ๊ฐ์ฅ ๋จผ ์ ์ ์, ํธ๋ฆฌ ์ง๋ฆ์ ์ ์ ์ค ํ๋์ด๋ค.
์ด ์ฑ์ง์ ํ์ฉํ๋ฉด, ๊ฐ์ฅ ๋จผ ์ ์ ์ ์ฐพ๊ณ (BFS ๋๋ DFS) ๊ทธ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๋จผ ์ ์ ์ ์ฐพ์ ๊ทธ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ฌธ์ ๋ ๋น ๋ฅด๊ฒ ํด๊ฒฐํ ์ ์๋ค.
์ฝ๋
import sys
input=sys.stdin.readline
from collections import deque
V=int(input().rstrip())
graph=[[] for _ in range(V+1)]
for _ in range(V):
row=list(map(int, input().rstrip().split()))
start=row[0]
for i in range(1, len(row), 2):
if row[i]==-1:
break
elif row[i]>0:
graph[start].append((row[i], row[i+1]))
def bfs(start):
dists=[-1 for _ in range(V+1)]
dists[start]=0
visited=[0 for _ in range(V+1)]
visited[start]=1
q=deque([(start, 0)])
while q:
end, dist=q.popleft()
for i in range(len(graph[end])):
c_end, c_dist=graph[end][i]
if visited[c_end]==0:
if dists[c_end]<dists[end]+c_dist:
dists[c_end]=dists[end]+c_dist
q.append((c_end, dists[c_end]))
visited[c_end]=1
max_dist=max(dists)
diameter_node=[i for i in range(1, V+1) if dists[i]==max_dist][0]
return diameter_node, max_dist
u, dist=bfs(start)
v, dist=bfs(u)
diameter=dist
print(diameter)
์ฌ๊ธฐ์ ๋ ํธ๊ธฐ์ฌ์ด ์๊ฒผ๋ ๋ถ๋ถ์ '์ด๋ป๊ฒ ์์ ์ฑ์ง์ ์ฆ๋ช ํ ์ ์๋๊ฐ'ํ๋ ๋ฌธ์ ์๋ค. ์ฆ๋ช ์๋ ์ฌ๋ฌ๊ฐ์ง ์ ๊ทผ์ด ์์์ง๋ง, ๋์ฒด๋ก ๊ท๋ฅ๋ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์ฆ๋ช ํ๋ ๋ฐฉ๋ฒ์ด ๋ง์๋ค.
๊ท๋ฅ๋ฒ์ ์ด๋ค ๋ช ์ ์ ๋ถ์ ์ด ๊ฑฐ์ง์์ ์ฆ๋ช ํ์ฌ, ์๋ช ์ ๊ฐ ์ฐธ์์ ์ฆ๋ช ํ๋ ๋ ผ์ฆ ๋ฐฉ๋ฒ์ด๋ค. ์ด์ธ์ ๊ท๋ฉ๋ฒ, ์ฐ์ญ๋ฒ๊ณผ ๊ฐ์ ๋ ผ์ฆ ๋ฐฉ๋ฒ์ด ์๋ค.
์ด ํฌ์คํ ์ ์ฐธ๊ณ ํ์ฌ ๋ ธํธ์ ์ค์ค๋ก ์ฆ๋ช ํด๋ณด์๋ค.
์ํ์ ๋ ผ์ฆ๋ฒ, ์ด๋ ๊ฒ ์ธ๊ฐ์ ์ธ ์์์์ ์ฌ์ฉํ๋ ์ดํด๊ฐ ์ ๋๋ค.
'๐ป ์ปดํจํฐ๊ณตํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ฐฑ์ค 2734: ๋๋ผํต ์๊ธฐ (0) | 2024.01.11 |
---|---|
[Python] ๋ฐฑ์ค 1876: ํ๊ธฐ๋ ๋ณผ๋ง๊ณต (5) | 2024.01.09 |
[Python] ๋ฐฑ์ค 1916: ์ต์๋น์ฉ ๊ตฌํ๊ธฐ (dijkstra) (0) | 2024.01.07 |
[Python] ๋ฐฑ์ค 14502: ์ฐ๊ตฌ์ (์กฐํฉ, bfs ์ต์ ํ) (1) | 2024.01.02 |
[Python] ๋ค๋ฆฌ ๋๊ธฐ: ๋๋์ด ๋จ์ด์ง๋ ์ ์ ๋๋์ ์ ์ค์ฐจ ์ค์ด๊ธฐ (2) | 2024.01.02 |