DOing
[์๊ณ ๋ฆฌ์ฆ] ํ๋ก์ด๋ ์์ with Python ๋ณธ๋ฌธ
๐ก ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ทธ๋์ '๊ธธ์ฐพ๊ธฐ'๋ฌธ์ ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค. ํ๋ถ ์์ค์์ ์ฌ์ฉํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ, ํ๋ก์ด๋ ์์ , ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ด๋ ๊ฒ 3๊ฐ์ง์ด๋ค. ์ด ์ค ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฒ ํฌ์คํ ์์ ๋ค๋ค๋ณด๋ ค๊ณ ํ๋ค.
๐ก ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ 'ํ ์ง์ '์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ด์๋ค. ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ '๋ชจ๋ ๋ ธ๋'์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ ธ๋์ ๊ฐ์๊ฐ N์ด๋ผ๊ณ ํ ๋ N๋ฒ๋งํผ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ฉฐ '์ ํ์'์ ๋ง๊ฒ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐฑ์ ํ๊ธฐ ๋๋ฌธ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋ณผ ์ ์๋ค. ๊ตฌํ ๋์ด๋๊ฐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ์ฝ์ง๋ง, ์๊ฐ๋ณต์ก๋๊ฐ O(N^3)์ด๊ธฐ ๋๋ฌธ์ ๋ ธ๋์ ๊ฐ์ ์๊ฐ ์์ ๋๋ง ์ฌ์ฉํด์ผํ๋ค. (๋ ธ๋์ ๊ฐฏ์๊ฐ ์ฝ 500๊ฐ ์ดํ์ผ๋๋ง ๊ณ ๋ คํด์ผํ๋ค.)
๐ก ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ ๋์ ๊ณผ์
๊ฐ ๋จ๊ณ์์๋ ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๋ค. ์๋ฅผ ๋ค์ด k๋ฒ ๋ ธ๋์ ๋ํด์ ํ์ธํ ๋๋ k๋ฒ ๋ ธ๋๋ฅผ ์ค๊ฐ์ ๊ฑฐ์ณ ์ง๋๊ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๋ฉด๋๋ค. ์ด๋ฅผ ์ ํ์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
D(a,b) = min(D(a,b), D(a,k)+D(k,b))
์ ํ์์ ์๋ฏธํ๋ ๋ด์ฉ์ ํ์ด์ ์ค๋ช ํ๋ฉด (a์์ b๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ, a์์ k๋ฅผ ๊ฑฐ์ณ์ b๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ)๋ฅผ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, k๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๊ฒ์ด ๋น ๋ฅด๋ค๋ฉด ์ต๋จ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐฑ์ ํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
[step0]
์ฃผ์ด์ง ์ฐ๊ฒฐ์ ๋ณด๋ฅผ ์ด์ฉํด์ ํ ์ด๋ธ์ ์ด๊ธฐํํ๋ค.
์ธ์ ํ ๋ ธ๋๋ผ๋ฉด ๊ทธ ๋น์ฉ์ ๊ฐ์ผ๋ก ๋ฃ๊ณ ์ธ์ ํ ๋ ธ๋๊ฐ ์๋๋ผ๋ฉด ๋ฌดํ์ด๋ผ๋ ๊ฐ์ ๋ฃ๋๋ค.
[step1]
1๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๋ค.
์ ํํ 3*2=6๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด์๋ง ๊ณ ๋ คํ๋ฉด๋๋ค.
6๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด์ ์ ํ์์ ๊ณ์ฐํ๋ค.
D(2,3) = min(D(2,3), D(2,1)+D(1,3)) = min(7, 3+INF)
D(2,4) = min(D(2,4), D(2,1)+D(1,4)) = min(INF, 3+6)
D(3,2) = min(D(3,2), D(3,1)+D(1,2)) = min(INF, 5+4)
D(3,4) = min(D(3,4), D(3,1)+D(1,4)) = min(4, 5+6)
D(4,2) = min(D(4,2), D(4,1)+D(1,2)) = min(INF, INF+4)
D(4,3) = min(D(4,3), D(4,1)+D(1,3)) = min(2, INF+INF)
[step2]
2๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก 3*2=6๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด์ ์ ํ์์ ๊ณ์ฐํ๋ค.
๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ ธ๋3, ๋ ธ๋4์ ๋ํด์๋ ๋ฐ๋ณตํ๋ค. ์ต์ข ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด 2์ฐจ์ ๋ฆฌ์คํธ๊ฐ ํํํ๋ ๋ฐ๋ D(2,3)=7, 2๋ฒ ๋ ธ๋์์ 3๋ฒ ๋ ธ๋๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ 7์์ ์๋ฏธํ๋ค.
์ด๋ ๊ฒ '๋ชจ๋ ๋ ธ๋'์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ณ์ฐํ์ฌ 2์ฐจ์๋ฆฌ์คํธ๋ก ์ ์ฅํ์๋ค.
๐ก ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต ์ค์
# ๋
ธ๋์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n, m = map(int, input().split())
# ์ต๋จ๊ฒฝ๋ก ๋ฆฌ์คํธ
# ๋
ธ๋๋ฒํธ๊ฐ 1๋ฒ๋ถํฐ ์์ํ์ฌ(n+1)๋ก ์ค์
graph = [[INF]*(n+1) for _ in range(n+1)]
# ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
for a in range(1, n+1):
for b in range(1,n+1):
if a==b:
graph[a][b] = 0
# ๋
ธ๋์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ์ ๊ทธ ๊ฐ์ผ๋ก ์ด๊ธฐํ
for _ in range(m):
# A์์ B๋ก ๊ฐ๋ ๋น์ฉ์ C
a,b,c = map(int, input().split())
graph[a][b] = c
# ์ ํ์์ ๋ฐ๋ผ ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ ์ํ
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b])
# ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
for a in range(1, n+1):
for b in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ์ด๋ผ๊ณ ์ถ๋ ฅ
if graph[a][b] == INF :
print("X", end =" ")
else: # ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ
print(graph[a][b], end=" ")
print() # ์ค๋ฐ๊ฟ
๐ก ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ ์์
Q1. ๋ฏธ๋๋์
๋ฏธ๋๋์์๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ ํ์ฌ๊ฐ ์๋๋ฐ ํน์ ํ์ฌ๋ผ๋ฆฌ๋ ์๋ก ๋๋ก๋ฅผ ํตํด ์ฐ๊ฒฐ๋์ด์๋ค. ๋ฐฉ๋ฌธ ํ๋งค์ A๋ ํ์ฌ 1๋ฒ ํ์ฌ์ ์์นํด์์ผ๋ฉด X๋ฒํ์ฌ์ ๋ฐฉ๋ฌธํด ๋ฌผ๊ฑด์ ํ๋งคํ๊ณ ์ ํ๋ค. ๋ฏธ๋๋์์์ ํน์ ํ์ฌ์ ๋์ฐฉํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํ์ฌ๋ผ๋ฆฌ ์ฐ๊ฒฐ๋ ๋๋ก๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ ์ผํ๋ค. ๋ํ ์ฐ๊ฒฐ๋ 2๊ฐ์ ํ์ฌ๋ ์๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์๋ค. ๋ฏธ๋ ๋์์์์ ๋๋ก๋ ๋งํ์ ์๋๋ก ์ฌ๋์ ์ด๋์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ํน์ ํ์ฌ์ ๋ค๋ฅธ ํ์ฌ๊ฐ ๋๋ก๋ก ์ฐ๊ฒฐ๋์ด์๋ค๋ฉด ์ ํํ 1๋งํผ์ ์๊ฐ์ผ๋ก ์ด๋ํ ์ ์๋ค.
๋ํ ์ค๋ ๋ฐฉ๋ฌธํ๋งค์์ ๊ธฐ๋ํ๋ ์๊ฐํ ์๋ ์ฐธ์ํ๊ณ ์ํ๋ค. ์๊ฐํ ์๋๋ K๋ฒ ํ์ฌ์ ์กด์ฌํ๋ค. ๋ฐฉ๋ฌธ ํ๋งค์ A๋ X๋ฒํ์ฌ์ ๊ฐ์ ๋ฌผ๊ฑด์ ํ๋งคํ๊ธฐ ์ ์ ๋จผ์ ์๊ฐํ ์๋์ ํ์ฌ์ ์ฐพ์๊ฐ์ ํจ๊ป ์ปคํผ๋ฅผ ๋ง์ค ์์ ์ด๋ค. ๋ฐ๋ผ์ ๋ฐฉ๋ฌธ ํ๋งค์ A๋ 1๋ฒํ์ฌ์์ ์ถ๋ฐํ์ฌ K๋ฒ ํ์ฌ๋ฅผ ๋ฐฉ๋ฌธํ ๋ค์ X๋ฒ ํ์ฌ๋ก ๊ฐ๋ ๊ฒ์ด ๋ชฉํ๋ค. ์ด๋ ๋ฐฉ๋ฌธํ๋งค์ A๋ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ด๋ํ๊ณ ์ถ๋ค.๋ฐฉ๋ฌธ ํ๋งค์์ด ํ์ฌ ์ฌ์ด๋ฅผ ์ด๋ํ๊ฒ ๋๋ ์ต์์๊ฐ์ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค, ์ด๋ ์๊ฐํ ์ ์๋๋ฐฉ๊ณผ ์ปคํผ๋ฅผ ๋ง์๋ ์๊ฐ์ ๊ณ ๋ คํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ค.
*์ ๋ ฅ์กฐ๊ฑด
- ์ฒซ์งธ์ค์ ์ ์ฒด ํ์ฌ์ ๊ฐ์ N๊ณผ ๊ฒฝ๋ก์ ๊ฐ์ M์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค.(1<=N,M<=100)
- ๋๋ฒ์งธ์ค๋ถํฐ M+1๋ฒ์งธ ์ค์๋ ์ฐ๊ฒฐ๋ ๋ํ์ฌ์ ๋ฒํธ๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค.
- M+2๋ฒ์งธ์ค์๋ X์ K๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค.(1<=K<=100)
*์ถ๋ ฅ์กฐ๊ฑด
- ์ฒซ๋ฒ์งธ ์ค์ ๋ฐฉ๋ฌธ ํ๋งค์ A๊ฐ K๋ฒ ํ์ฌ๋ฅผ ๊ฑฐ์ณ X๋ฒ ํ์ฌ๋ก ๊ฐ๋ ์ต์ ์ด๋ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
- ๋ง์ฝ X์ ๋๋ฌํ ์ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ ์์ | ์ถ๋ ฅ ์์ |
5 7 1 2 1 3 1 4 2 4 3 4 3 5 4 5 4 5 |
3 |
4 2 1 3 2 4 3 4 |
-1 |
[๋ฌธ์ ์์ด๋์ด]
์ ์ฒด ํ์ฌ์ ๊ฐ์์ ๊ฒฝ๋ก์ ๊ฒฝ์๊ฐ 100๊ฐ ์ดํ๋ก ํฌ์ง ์๋ค. 1๋ฒ์์ K๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ์ K์์ X๋ก ์ด๋ํ๋ ๋๊ฐ์ง์ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ์ด๋ ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์๋ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
[์ฝ๋]
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต ์ค์
# ๋
ธ๋์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n, m = map(int, input().split())
# ์ต๋จ๊ฒฝ๋ก ๋ฆฌ์คํธ
# ๋
ธ๋๋ฒํธ๊ฐ 1๋ฒ๋ถํฐ ์์ํ์ฌ(n+1)๋ก ์ค์
graph = [[INF]*(n+1) for _ in range(n+1)]
# ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
for a in range(1, n+1):
for b in range(1,n+1):
if a==b:
graph[a][b] = 0
# ๋
ธ๋์ ์ฐ๊ฒฐ ์ ๋ณด
for _ in range(m):
# A์์ B๋ก ๊ฐ๋ ๋น์ฉ์ 1๋ก ๋์ผ. ์๋ฐฉํฅ์ด๋ค.
a,b = map(int, input().split())
graph[a][b] = 1
graph[b][a] = 1
# ๊ฑฐ์ณ๊ฐ ๋
ธ๋ k์ ์ต์ข
๋ชฉ์ ์ง x
x, k = map(int, input().split())
# ์ ํ์์ ๋ฐ๋ผ ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ ์ํ
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b])
# ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
result = graph[1][k]+graph[k][x]
#๋๋ฌ ๋ถ๊ฐ๋ฅ
if result >= INF :
print("-1")
else: # ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ
print(result, end=" ")
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] ๊ทธ๋ํ (0) | 2021.06.15 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] Disjoint Sets(์๋ก์ ์งํฉ) (0) | 2021.05.31 |
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ ์ต๋จ๊ฒฝ๋ก with Python (0) | 2021.05.23 |
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ with Python (0) | 2021.05.23 |
[์๊ณ ๋ฆฌ์ฆ] ์ด์งํ์ with Python (0) | 2021.05.22 |