from collections import defaultdict
def solution(graph, start):
# โถ ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ๋ณํ
adj_list = defaultdict(list)
for u, v in graph:
adj_list[u].append(v)
# โท DFS ํ์ ํจ์
def dfs(node, visited, result):
visited.add(node) # โธ ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ค์ ์งํฉ์ ์ถ๊ฐ
result.append(node) # โน ํ์ฌ ๋
ธ๋๋ฅผ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ์ถ๊ฐ
for neighbor in adj_list.get(node, []): # โบ ํ์ฌ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋์ํ
if neighbor not in visited: # โป ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
dfs(neighbor, visited, result)
# DFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
visited = set()
result = []
dfs(start, visited, result) # โผ ์์ ๋
ธ๋์์ ๊น์ด ์ฐ์ ํ์ ์์
return result # โฝ DFS ํ์ ๊ฒฐ๊ณผ ๋ฐํ
# TEST ์ฝ๋ ์
๋๋ค. ์ฃผ์์ ํ๊ณ ์คํ์์ผ๋ณด์ธ์
# print(solution([['A', 'B'], ['B', 'C'], ['C', 'D'], ['D', 'E']], 'A')) # ๋ฐํ๊ฐ : ['A', 'B', 'C', 'D', 'E']
# print(solution([['A', 'B'], ['A', 'C'], ['B', 'D'], ['B', 'E'], ['C', 'F'], ['E', 'F']], 'A')) # ๋ฐํ๊ฐ : ['A', 'B', 'D', 'E', 'F', 'C']
from collections import defaultdict, deque
def solution(graph, start):
# ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ๋ณํ
adj_list = defaultdict(list)
for u, v in graph:
adj_list[u].append(v)
# BFS ํ์ ํจ์
def bfs(start):
visited = set() # โถ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ์ ์ฅํ ์
# โท ํ์์ ๋งจ ์ฒ์ ๋ฐฉ๋ฌธํ ๋
ธ๋ ํธ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
queue = deque([start])
visited.add(start)
result.append(start)
# โธ ํ๊ฐ ๋น์ด์์ง ์์ ๋์ ๋ฐ๋ณต
while queue:
node = queue.popleft() # โน ํ์ ์๋ ์์ ์ค ๊ฐ์ฅ ๋จผ์ ํธ์๋ ์์ ํ
for neighbor in adj_list.get(node, []): #โบ ์ธ์ ํ ์ด์ ๋
ธ๋๋ค์ ๋ํด์
if neighbor not in visited: # โป ๋ฐฉ๋ฌธ๋์ง ์์ ์ด์ ๋
ธ๋์ธ ๊ฒฝ์ฐ
# โผ ์ด์๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํจ
queue.append(neighbor)
visited.add(neighbor)
result.append(neighbor)
result = []
bfs(start) # โฝ ์์ ๋
ธ๋๋ถํฐ BFS ํ์ ์ํ
return result
# TEST ์ฝ๋ ์
๋๋ค. ์ฃผ์์ ํ๊ณ ์คํ์์ผ๋ณด์ธ์
# print(solution([(1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7), (4, 8), (5, 8), (6, 9), (7, 9)],1)) # ๋ฐํ๊ฐ :[1, 2, 3, 4, 5, 6, 7, 8, 9]
# print(solution([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 0)],1)) # ๋ฐํ๊ฐ : [1, 2, 3, 4, 5, 0]
import heapq
def solution(graph, start):
distances = {node: float("inf") for node in graph} # โถ ๋ชจ๋ ๋
ธ๋์ ๊ฑฐ๋ฆฌ ๊ฐ์ ๋ฌดํ๋๋ก ์ด๊ธฐํ
distances[start] = 0 # โท ์์ ๋
ธ๋์ ๊ฑฐ๋ฆฌ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ
queue = []
heapq.heappush(queue, [distances[start], start]) # โธ ์์ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
paths = {start: [start]} # โน ์์ ๋
ธ๋์ ๊ฒฝ๋ก๋ฅผ ์ด๊ธฐํ
while queue:
# โบ ํ์ฌ ๊ฐ์ฅ ๊ฑฐ๋ฆฌ ๊ฐ์ด ์์ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์ด
current_distance, current_node = heapq.heappop(queue)
# โป ๋ง์ฝ ํ์ฌ ๋
ธ๋์ ๊ฑฐ๋ฆฌ ๊ฐ์ด ํ์์ ๊ฐ์ ธ์จ ๊ฑฐ๋ฆฌ ๊ฐ๋ณด๋ค ํฌ๋ฉด, ํด๋น ๋
ธ๋๋ ์ด๋ฏธ ์ฒ๋ฆฌํ ๊ฒ์ด๋ฏ๋ก ๋ฌด์
if distances[current_node] < current_distance:
continue
# โผ ํ์ฌ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋๋ค์ ๊ฑฐ๋ฆฌ ๊ฐ์ ๊ณ์ฐํ์ฌ ์
๋ฐ์ดํธ
for adjacent_node, weight in graph[current_node].items():
distance = current_distance + weight
# โฝ ํ์ฌ ๊ณ์ฐํ ๊ฑฐ๋ฆฌ ๊ฐ์ด ๊ธฐ์กด ๊ฑฐ๋ฆฌ ๊ฐ๋ณด๋ค ์์ผ๋ฉด ์ต์ ๋น์ฉ ๋ฐ ์ต๋จ ๊ฒฝ๋ก ์
๋ฐ์ดํธ
if distance < distances[adjacent_node]:
distances[adjacent_node] = distance # ์ต์ ๋น์ฉ ์
๋ฐ์ดํธ
paths[adjacent_node] = paths[current_node] + [adjacent_node] # ์ต๋จ ๊ฒฝ๋ก ์
๋ฐ์ดํธ
# โ ์ต์ ๊ฒฝ๋ก๊ฐ ๊ฐฑ์ ๋ ๋
ธ๋๋ฅผ ๋น์ฉ๊ณผ ํจ๊ป ํ์ ํธ์
heapq.heappush(queue, [distance, adjacent_node])
# โ paths ๋์
๋๋ฆฌ๋ฅผ ๋
ธ๋ ๋ฒํธ์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์ฌ ๋ฐํ
sorted_paths = {node: paths[node] for node in sorted(paths)}
return [distances, sorted_paths]
# TEST ์ฝ๋ ์
๋๋ค. ์ฃผ์์ ํ๊ณ ์คํ์์ผ๋ณด์ธ์
# print(solution({ 'A': {'B': 9, 'C': 3}, 'B': {'A': 5}, 'C': {'B': 1} },'A')) # ๋ฐํ๊ฐ :[{'A': 0, 'B': 4, 'C': 3}, {'A': ['A'], 'B': ['A', 'C', 'B'], 'C': ['A', 'C']}]
# print(solution({'A': {'B': 1},'B': {'C': 5},'C': {'D': 1},'D': { } }, 'A')) # ๋ฐํ๊ฐ :[{'A': 0, 'B': 1, 'C': 6, 'D': 7}, {'A': ['A'], 'B': ['A', 'B'], 'C': ['A', 'B', 'C'], 'D': ['A', 'B', 'C', 'D']}]
def solution(graph, source):
# โ ๊ทธ๋ํ์ ๋
ธ๋ ์
num_vertices = len(graph)
# โ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด ์ด๊ธฐํ
distance = [float("inf")] * num_vertices
distance[source] = 0
# โ ์ง์ ๊ฒฝ๋ก ๋ฐฐ์ด ์ด๊ธฐํ
predecessor = [None] * num_vertices
# โ ๊ฐ์ ์ ๋งํผ ๋ฐ๋ณตํ์ฌ ์ต๋จ ๊ฒฝ๋ก ๊ฐฑ์
for temp in range(num_vertices - 1):
for u in range(num_vertices):
for v, weight in graph[u]:
# โ ํ์ฌ ๋
ธ๋ u๋ฅผ ๊ฑฐ์ณ์ ๋
ธ๋ v๋ก ๊ฐ๋ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์ ์ฅ๋ ๋
ธ๋ v๊น์ง์ ๊ฑฐ๋ฆฌ๋ณด๋ค ์งง์ ๊ฒฝ์ฐ
if distance[u] + weight < distance[v]:
# โ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํด์ค๋๋ค.
distance[v] = distance[u] + weight
# โ ์ง์ ๊ฒฝ๋ก๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
predecessor[v] = u
# โ ์์ ๊ฐ์ค์น ์ํ ์ฒดํฌ
for u in range(num_vertices):
for v, weight in graph[u]:
# โ ํ์ฌ ๋
ธ๋ u๋ฅผ ๊ฑฐ์ณ์ ๋
ธ๋ v๋ก ๊ฐ๋ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์ ์ฅ๋ ๋
ธ๋ v๊น์ง์ ๊ฑฐ๋ฆฌ๋ณด๋ค ์งง์ ๊ฒฝ์ฐ
if distance[u] + weight < distance[v]:
# โฟ ์์ ๊ฐ์ค์น ์ํ๊ฐ ๋ฐ๊ฒฌ๋์์ผ๋ฏ๋ก [-1]์ ๋ฐํํฉ๋๋ค.
return [-1]
return [distance, predecessor]
# TEST ์ฝ๋ ์
๋๋ค. ์ฃผ์์ ํ๊ณ ์คํ์์ผ๋ณด์ธ์
# print(solution([[(1, 4), (2, 3), (4, -6 )], [(3, 5)], [(1, 2)], [(0, 7), (2, 4)],[(2, 2)]],0)) #๋ฐํ๊ฐ : [[0, -2, -4, 3, -6], [None, 2, 4, 1, 0]]
# print(solution([[(1, 5), (2, -1)], [(2, 2)], [(3, -2)], [(0, 2), (1, 6)]],0)) # ๋ฐํ๊ฐ : [-1]
๋ฌธ์ 42_๊ฒ์ ๋งต ์ต๋จ ๊ฑฐ๋ฆฌ
๋ฌธ์ 43_๋คํธ์ํฌ
๋ฌธ์ 44_๋ฐฐ๋ฌ