
그래프는 정점(Node)과 간선(Edge)로 구성된 자료구조
❇️ 그래프의 종류
graph = [[] for _ in range(n)]
graph[0].append(1)
graph[1].append(0)
➡️ 메모리 효율 좋음
📍 노드 수가 많으면 무조건 인접 리스트
graph = [[0]*n for _ in range(n)]
graph[0][1] = 1
➡️ 장: 연결 여부 확인 빠름
➡️ 단: 메모리 큼
def dfs(v):
visited[v] = True
for nxt in graph[v]:
if not visited[nxt]:
dfs(nxt)
from collections import deque
def bfs(start):
q = deque([start])
visited[start] = True
while q:
v = q.popleft()
for nxt in graph[v]:
if not visited[nxt]:
visited[nxt] = True
q.append(nxt)
문제 느낌
정점 N개, 간선 M개가 주어질 때 연결된 덩어리가 몇 개인지?
왜 중요한가?
👉 포인트
무방향 그래프
방향 그래프
visited + recursion stack 사용왜 중요한가?
👉 포인트
if visited[nxt] and next != parent문제 느낌
한 점에서 다른 모든 점까지의 최소 이동 횟수
dist = [-1] * n
dist[start] = 0
👉 포인트
dist[nxt] = dist[cur] + 1문제 느낌
👉 포인트
사이클이 없는 그래프
❇️ 트리 특징
def dfs(node):
for child in tree[node]:
dfs(child)
❇️ 후위 순회: 자식 계산 후 부모 처리하는 DP 문제
문제 느낌
👉 포인트
parent[child] = node문제 느낌
depth[child] = depth[node] + 1
문제 느낌
👉 포인트
size[node] = 1
for child in tree[node]:
size[node] += size[child]
문제 느낌
버전