๐ณ ๋งํฌ
๐ ๋ฌธ์
๋ฐฉํฅ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด ์ฃผ์ด์ง ์์์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ 10 ์ดํ์ ์์ฐ์์ด๋ค.
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ V์ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค. (1โคVโค20,000, 1โคEโค300,000) ๋ชจ๋ ์ ์ ์๋ 1๋ถํฐ V๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ๋์งธ ์ค์๋ ์์ ์ ์ ์ ๋ฒํธ K(1โคKโคV)๊ฐ ์ฃผ์ด์ง๋ค. ์ ์งธ ์ค๋ถํฐ E๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ๊ฐ์ ์ ๋ํ๋ด๋ ์ธ ๊ฐ์ ์ ์ (u, v, w)๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ด๋ u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ธ ๊ฐ์ ์ด ์กด์ฌํ๋ค๋ ๋ป์ด๋ค. u์ v๋ ์๋ก ๋ค๋ฅด๋ฉฐ w๋ 10 ์ดํ์ ์์ฐ์์ด๋ค. ์๋ก ๋ค๋ฅธ ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์กด์ฌํ ์๋ ์์์ ์ ์ํ๋ค.
๐พ ํ์ด ๋ฐฉ๋ฒ
์ฒ์์ ํ์ด๋, ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํด์ dfs๋ก ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ๋๋ฉด์ cost๋ฅผ ์ ๋ฐ์ดํธํด์ฃผ๊ณ , ๊ฐ์ฅ ์์ cost๋ฅผ result๋ฐฐ์ด์ ์ ์ฅํด์ฃผ๋ ์์ผ๋ก ํ์๋ค. ํ์ง๋ง ๊ณ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๊ณ , ๊ฒฐ๊ตญ ๊ฒ์ ๋์ dijkstra ๋ฐ heap, ๊ทธ๋ฆฌ๊ณ ์ธ์ ํ๋ ฌ ๋์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค!!
๋จผ์ ์
๋ ฅ์ ๋ฐ์ ๋ ์ธ์ ๋ฆฌ์คํธ๋ก [index, cost]๋ฅผ graph[start]์ ๋ฃ์ด์ฃผ๊ณ , dijkstra๋ฅผ ์ด์ฉํด์ ํ์ด๋ฅผ ์์ํ๋ค.
๋จผ์ dist๋ผ๋ ๋ฐฐ์ด์ ์ ์ธํ ๋ค, dist[k]์๋ 0์ ๋ฃ์ด์ค๋ค.(์กฐ๊ฑด)
heapq์ (์ดํ hq) [cost,node]๋ฅผ ๋ฃ์ด์ค ๋ค, cost๊ฐ ์ต์์ธ ๋
ธ๋๋ฅผ hq์์ popํ๋ฉฐ ๋น๊ตํด์ค๋ค. cost๊ฐ dist[node]์ ๊ฐ๋ณด๋ค ํฌ๋ฉด continue๋ฅผ ํตํด ๋ค์์ผ๋ก ๋์ด๊ฐ๊ณ , ์๋๋ผ๋ฉด ํด๋น node์ ์ด์์ ํ์ํ๋ฉฐ cost๋ฅผ ์
๋ฐ์ดํธํ๋ค.
๋ํ ์ฌ๊ธฐ์, ์ฃผ์ํ ์ ์ด ์๋ ํญ์ ์ ๋ ฅ์ ๋ฐ๊ณ ๋ถ๋ฆฌ์ํฌ ๋ map๊ณผ input์ ํ์ฉํ๋๋ฐ ์ด ๋ถ๋ถ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ ์ค์ ์์๋ ๋ชปํ๋ค! ๐ sys.stdin.readline().split()์ผ๋ก ๋ณ๊ฒฝํด์ฃผ์๋๋ ์๊ฐ ์ด๊ณผ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.. input์ด ๋ ๋๋ฆฌ๋ค๊ณ ํ๋ค!
solution ์ฝ๋
- ์ธ์ ๋ฆฌ์คํธ ๋ฐ dijkstra๋ฅผ ์ฌ์ฉํด์ ์ฑ๊ณตํ ์ฝ๋
import sys, heapq
sys.stdin = open("input.txt","rt")
inf = float('inf')
def dijkstra(v,k,graph):
dist = \[inf for \_ in range(v+1)\]
dist\[k\] = 0
hq = []
heapq.heappush(hq, [0,k]) #heapq์ [cost,node]๋ฅผ ๋ฃ์
while hq:
temp = heapq.heappop(hq) #cost๊ฐ ์ต์์ธ ๋
ธ๋
cost = temp[0]
node = temp[1]
if cost > dist[node]:
continue
for i in graph[node]:
neighbor = i[0]
cost_i = dist[node] + i[1]
if cost_i < dist[neighbor]:
dist[neighbor] = cost_i
heapq.heappush(hq, [cost_i, neighbor])
return dist
v, e = \[int(x) for x in sys.stdin.readline().split()\]
k = int(input())
graph = \[\[\] for \_ in range(v)\]
for \_ in range(e):
start, end, weight = \[int(x) for x in sys.stdin.readline().split()\]
graph\[start\].append(\[end,weight\])
answer = dijkstra(v,k,graph)
for dis in answer\[1:\]:
print(dis if dis != inf else 'INF')
- ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํด์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๋ ์ฝ๋...
import sys
sys.setrecursionlimit(10**5)
sys.stdin = open("input.txt","rt")
def dfs(node, target, value):
if node == target:
if result[target] == -1:
result[target] = value
if result[target] > value:
result[target] = value
else:
for i in range(v):
if graph[node][i] != 0 and visit[node] == 0:
visit[node] = 1
dfs(i,target,value + graph[node][i])
visit[node] = 0
if __name__ == "__main__":
v, e = map(int,input().split())
k = int(input())
k -= 1
graph = [[0] * v for _ in range(v)]
for i in range(e):
start, end, weight = map(int,input().split())
graph[start-1][end-1] = weight
result = [-1] * v
visit = [0] * v
for i in range(v):
if i != k:
dfs(k,i,0)
else:
result[i] = 0
for res in result:
if res == -1:
print("INF")
else:
print(res)