# Adjacency List
graph = defaultdict(list)
graph[u].append(v)
# BFS
from collections import deque
def bfs(graph, start):
visited = {start}
queue = deque([start])
while queue:
node = queue.popleft()
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
# DFS (recursive)
def dfs(graph, node, visited=None):
if visited is None: visited = set()
visited.add(node)
for neighbor in graph[node]:
if neighbor not in visited:
dfs(graph, neighbor, visited)
# Use defaultdict instead of checking keys
# Use Counter for frequency counting
# Use heapq for top-k / priority problems
# Use bisect for sorted array problems
# Use deque for BFS / sliding window
# Use set for O(1) lookup
# Use zip() for parallel iteration
# Use enumerate() for index+value
# Use sorted() with key for custom sorting
# List comprehension > map/filter for readability