https://www.acmicpc.net/problem/1260
인접행렬 혹인 인접리스트를 이용해서 그래프를 탐색하는 방법을 아는지 묻는 문제이다. 인접행렬을 이용해서 풀어봤다.
일단 인접행렬을 구성해야 한다.
m개 간선이 있으므로 m번 반복하며 간선정보를 입력받고 입력받은 간선을 양방향으로 인접행렬에 설정해준다.
adj_arr = [[0] * (n+1) for _ in range(n+1)]
visited = [0] * (n+1)
for _ in range(m):
a, b = map(int, input().split())
adj_arr[a][b] = 1
adj_arr[b][a] = 1
이제 DFS부터 탐색을 시작한다.
def dfs(v):
visited[v] = 1
print(v, end = ' ')
for i in range(1, n+1):
if adj[v][i] == 1 and visited[i] == 0:
dfs(i)
다음은 BFS 부분이다.
def bfs(start):
q = [start]
visited[start] = 1
while(q):
v = q.pop(0)
print(v, end=' ')
for i in range(1, n+1):
if adj[v][i] == 1 and visited[i] == 0:
q.append(i)
visited[i] = 1
전체코드
def dfs(v):
visited[v] = 1
print(v, end = ' ')
for i in range(1, n+1):
if adj[v][i] == 1 and visited[i] == 0:
dfs(i)
def bfs(start):
q = [start]
visited[start] = 1
while(q):
v = q.pop(0)
print(v, end=' ')
for i in range(1, n+1):
if adj[v][i] == 1 and visited[i] == 0:
q.append(i)
visited[i] = 1
n, m, v = map(int, input().split())
adj = [[0] * (n + 1) for _ in range(n + 1)]
visited = [0] * (n+1)
for i in range(m):
a, b = map(int, input().split())
# 양방향
adj[a][b] = 1
adj[b][a] = 1
dfs(v)
visited = [0] * (n+1)
print()
bfs(v)