1. n, m, v 입력 받기 (띄어쓰기 입력)
n, m, v = map(int, input().split())
N(정점수), M(간선수), V(탐색 시작할 정점 번호)
2. 그래프 입력 받기 (노드 연결 정보) - 인접 행렬
graph = [[0] * (n+1) for _ in range(n+1)]
for i in range(m):
a, b = map(int, input().split())
graph[a][b] = graph[b][a] = 1
정점 번호와 인덱스 일치시키기 위해 n+1로 초기화
무방향 그래프이므로 graph[a][b] = graph[b][a] = 1
** 그래프 출력하기
def print_graph(graph):
for row in graph[1:]: # 0번째 행과 열은 사용하지 않음
print(' '.join(map(str, row[1:]))) # 0번째 열도 사용하지 않음
print_graph(graph)
참고. 인접 행렬 방식 vs 인접 리스트 방식
DFS/BFS | 관련 자료구조, 개념, 구현예제
DFS/BFS 를 위한 자료구조 기초 : 스택, 큐, 재귀함수탐색 : 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정대표적인 탐색 알고리즘 DFS, BFS - 기본 자료구조인 스택과 큐에대한 이해 필요 스
yesolz.tistory.com
3. 방문 정보 저장할 배열
visited1 = [False] * (n+1)
visited2 = visited1.copy()
참고로 copy()는 shallow copy (얕은 복사)
4. DFS
def dfs(v):
visited1[v] = True
print(v, end=' ')
for i in range(1, n+1):
if graph[v][i] == 1 and visited1[i] == False:
dfs(i)
노드 먼저 방문처리 해주고 바로 프린트,
1부터 n 인덱스 i
v와 i 연결되어있고 & 방문하지 않았다면 - 재귀호출로 DFS (스택 구조)
5. BFS
def bfs(v):
queue = [v]
visited2[v] = True
while queue:
v = queue.pop(0)
print(v, end=' ')
for i in range(1, n+1):
if graph[v][i] == 1 and visited2[i] == False:
queue.append(i)
visited2[i] = True
queue에 v 삽입하고 방문처리
큐가 비어있지 않을 때동안 계속 while문 실행
v를 queue에서 빼주고 프린트
1부터 n까지 인덱스 i 에서
v와 i 연결되어있고 & i 방문하지 않았다면 queue에 i 삽입하고 i도 방문 처리
전체 풀이
n, m, v = map(int, input().split())
# 그래프 - 노드 연결 정보 (2차원 리스트)
graph = [[0] * (n+1) for _ in range(n+1)]
for i in range(m):
a, b = map(int, input().split())
graph[a][b] = graph[b][a] = 1
# 방문 정보
visited1 = [False] * (n+1)
visited2 = visited1.copy()
def dfs(v):
visited1[v] = True
print(v, end=' ')
for i in range(1, n+1):
if graph[v][i] == 1 and visited1[i] == False:
dfs(i)
def bfs(v):
queue = [v]
visited2[v] = True
while queue:
v = queue.pop(0)
print(v, end=' ')
for i in range(1, n+1):
if graph[v][i] == 1 and visited2[i] == False:
queue.append(i)
visited2[i] = True
dfs(v)
print()
bfs(v)
ref.
https://velog.io/@falling_star3/%EB%B0%B1%EC%A4%80Python-1260%EB%B2%88-DFS%EC%99%80BFS
[백준][Python] 1260번 DFS와 BFS(DFS/BFS 기본 구현 자세히)
https://www.acmicpc.net/problem/1000두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.입력첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)출력첫째 줄에 A+B를 출력한다.입출력 예
velog.io
1. n, m, v 입력 받기 (띄어쓰기 입력)
n, m, v = map(int, input().split())
N(정점수), M(간선수), V(탐색 시작할 정점 번호)
2. 그래프 입력 받기 (노드 연결 정보) - 인접 행렬
graph = [[0] * (n+1) for _ in range(n+1)]
for i in range(m):
a, b = map(int, input().split())
graph[a][b] = graph[b][a] = 1
정점 번호와 인덱스 일치시키기 위해 n+1로 초기화
무방향 그래프이므로 graph[a][b] = graph[b][a] = 1
** 그래프 출력하기
def print_graph(graph):
for row in graph[1:]: # 0번째 행과 열은 사용하지 않음
print(' '.join(map(str, row[1:]))) # 0번째 열도 사용하지 않음
print_graph(graph)
참고. 인접 행렬 방식 vs 인접 리스트 방식
DFS/BFS | 관련 자료구조, 개념, 구현예제
DFS/BFS 를 위한 자료구조 기초 : 스택, 큐, 재귀함수탐색 : 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정대표적인 탐색 알고리즘 DFS, BFS - 기본 자료구조인 스택과 큐에대한 이해 필요 스
yesolz.tistory.com
3. 방문 정보 저장할 배열
visited1 = [False] * (n+1)
visited2 = visited1.copy()
참고로 copy()는 shallow copy (얕은 복사)
4. DFS
def dfs(v):
visited1[v] = True
print(v, end=' ')
for i in range(1, n+1):
if graph[v][i] == 1 and visited1[i] == False:
dfs(i)
노드 먼저 방문처리 해주고 바로 프린트,
1부터 n 인덱스 i
v와 i 연결되어있고 & 방문하지 않았다면 - 재귀호출로 DFS (스택 구조)
5. BFS
def bfs(v):
queue = [v]
visited2[v] = True
while queue:
v = queue.pop(0)
print(v, end=' ')
for i in range(1, n+1):
if graph[v][i] == 1 and visited2[i] == False:
queue.append(i)
visited2[i] = True
queue에 v 삽입하고 방문처리
큐가 비어있지 않을 때동안 계속 while문 실행
v를 queue에서 빼주고 프린트
1부터 n까지 인덱스 i 에서
v와 i 연결되어있고 & i 방문하지 않았다면 queue에 i 삽입하고 i도 방문 처리
전체 풀이
n, m, v = map(int, input().split())
# 그래프 - 노드 연결 정보 (2차원 리스트)
graph = [[0] * (n+1) for _ in range(n+1)]
for i in range(m):
a, b = map(int, input().split())
graph[a][b] = graph[b][a] = 1
# 방문 정보
visited1 = [False] * (n+1)
visited2 = visited1.copy()
def dfs(v):
visited1[v] = True
print(v, end=' ')
for i in range(1, n+1):
if graph[v][i] == 1 and visited1[i] == False:
dfs(i)
def bfs(v):
queue = [v]
visited2[v] = True
while queue:
v = queue.pop(0)
print(v, end=' ')
for i in range(1, n+1):
if graph[v][i] == 1 and visited2[i] == False:
queue.append(i)
visited2[i] = True
dfs(v)
print()
bfs(v)
ref.
https://velog.io/@falling_star3/%EB%B0%B1%EC%A4%80Python-1260%EB%B2%88-DFS%EC%99%80BFS
[백준][Python] 1260번 DFS와 BFS(DFS/BFS 기본 구현 자세히)
https://www.acmicpc.net/problem/1000두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.입력첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)출력첫째 줄에 A+B를 출력한다.입출력 예
velog.io