from collections import deque
com_num = int(input())
net_com_num = int(input())
dic = {}
for _ in range(net_com_num) :
a, b = map(int, input().split())
if a in dic : # 존재하는경우
dic[a].append(b)
else : # 존재하지않는경우
dic[a] = [b]
if b in dic :
dic[b].append(a)
else :
dic[b] = [a]
visited = [False] * (com_num+1)
def bfs(start) :
cnt = -1
queue = deque([start])
visited[start] = True
while (queue) :
v = queue.popleft()
cnt += 1
visited[v] = True
if v in dic :
for _v in dic[v] :
if visited[_v] == False :
visited[_v] = True
queue.append(_v)
return cnt
print(bfs(1))
n = int(input())
m = int(input())
graph = [[0] * (n+1) for i in range(n+1)]
visited = [0] * (n+1)
for _ in range(m):
a, b = map(int, input().split())
graph[a][b] = graph[b][a] = 1
result = []
def dfs(v):
visited[v] = 1
for i in range(1, n+1):
if graph[v][i] == 1 and visited[i] == 0:
result.append(i)
dfs(i)
return len(result)
print(dfs(1))
귀찮지만 dictionary로 구현하여 더 빠르게 돌리고싶었는데 오히려 더 느리게 나왔다.
dfs/bfs 비교를 봤을때
두 방식 모두 조건 내의 모든 노드를 검색한다는 점에서 시간 복잡도는 동일하지만 일반적으로 DFS를 재귀 함수로 구현한다는 점에서 DFS보다 BFS가 조금 더 빠르게 동작한다
라고 한다.
그래프의 모든 정점을 방문하는 것이 주요한 문제
경로의 특징을 저장해둬야 하는 문제
최단거리를 구하는 문제
이외에도 검색 대상 그래프가 정말 크다면 DFS를 고려하고 검색 대상의 규모가 크지 않고, 검색 시작 지점으로부터 원하는 대상이 별로 멀지 않다면 BFS를 고려하는 등으로 더 생각해볼 수 있다.