모든 관계를 저장하므로 노드 개수가 많을수록 메모리가 불필요하게 낭비된다.
두 노드가 연결되어 있는지에 대한 정보를 얻는 속도가 비교적 빠르다.
INF = 987654321
graph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
‘연결 리스트’라는 자료구조 이용 (파이썬에서는 2차원 리스트를 이용하면 된다.)
연결된 정보만을 저장하기 때문에 메모리를 효율적으로 사용한다.
두 노드가 연결되어 있는지에 대한 정보를 얻는 속도가 느리다. (연결된 데이터를 하나씩 확인해야 하기 때문)
graph = [[] for _ in range(3)]
graph[0].append((1, 7)) # 노드 정보 : (노드, 거리)
graph[0].append((2, 5))
graph[1].append((0, 7))
graph[2].append((0, 5))
collections
라이브러리의 deque
사용하면 시간 절약 가능
from collections import deque
def bfs(graph, start, visited):
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
graph = # 생략
visited = [False] * 9
bfs(graph, 1, visited)
from collections import deque
def BFS_with_adj_list(graph, root):
visited = []
queue = deque([root])
while queue:
n = queue.popleft()
if n not in visited:
visited.append(n)
queue += graph[n] - set(visited)
return visited
print(BFS_with_adj_list(graph_list, root_node))
def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end=' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
graph = # 생략
visited = [False] * 9
dfs(graph, 1, visited)
def DFS_with_adj_list(graph, root):
visited = []
stack = [root]
while stack:
n = stack.pop()
if n not in visited:
visited.append(n)
stack += graph[n] - set(visited)
return visited
print(BFS_with_adj_list(graph_list, root_node))
O(V^2)
O(V+E)
O(V^2)
O(V+E)
from collections import defaultdict
def solution(tickets):
answer = []
routes = defaultdict(list)
for ticket in tickets:
routes[ticket[0]].append(ticket[1])
for key in routes.keys():
routes[key].sort(reverse=True)
stack = ['ICN']
while stack:
tmp = stack[-1]
if not routes[tmp]:
answer.append(stack.pop())
else:
stack.append(routes[tmp].pop())
answer.reverse()
return answer
{ 시작점 : [도착점], ... }
형태의 인접 리스트
그래프를 생성DFS 알고리즘
을 사용해 모든 점을 순회 (스택이 빌때까지) (도착점부터 역순으로 찾음)
from collections import deque
def solution(n, computers):
answer = 0
visited = [0] * n
for i in range(n):
if visited[i]:
continue
answer += 1
dq = deque([computers[i]])
while dq:
nodes = dq.popleft()
for j in range(n):
if nodes[j] and not visited[j]:
dq.append(computers[j])
visited[j] = 1
return answer
[참고]
https://cyc1am3n.github.io/2019/04/26/bfs_dfs_with_python.html
https://velog.io/@kjh107704/그래프-BFS와-DFS