Open rhakdnj opened 2 years ago
보통 인접리스트로 할 생각을 하고 문제에서 만약에 인접행렬로 주어졌다면 인접행렬로 푸는 것이 좋다.
깊이 우선탐색은 그래프를 탐색할 때 쓰이는 알고리즘으로써 특정한 노드에서 가장 멀리 있는 노드를 먼저 탐색하는 알고리즘이다.
주어진 맵전체를 탐색하며 한번 방문한 노드는 다시한번 방문하지 않기 때문에 만약 인접리스트로 이루어진 맵이면 O(V + E)이고 인접행렬의 경우 O(V^2)가 된다.
def dfs(here: int):
visited[here] = 1;
for there in adj[here]:
if visited[there]: continue
dfs(there);
def dfs(here: int):
if visited[here]: return
visited[here] = 1;
for there in adj[here]:
dfs(there);
def dfs(y, x):
global visited, arr, n, m
print(y, x)
visited[y][x] = 1
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if ny < 0 or nx < 0 or ny >= n or nx >= m: continue
if arr[ny][nx] == 1 and not visited[ny][nx]:
dfs(ny, nx)
def solution():
global arr, visited, ret, n, m
for i in range(n):
arr.append(list(map(int, input().split())))
for i in range(n):
for j in range(m):
if arr[i][j] == 1 and not visited[i][j]:
ret += 1
dfs(i, j)
print('----------------------------------------------------')
print(ret)
dy = (-1, 0, 1, 0)
dx = (0, 1, 0, -1)
n, m = map(int, input().split())
arr = []
visited = [[0] * m for _ in range(n)]
ret = 0
solution()
가중치가 같을 때 최단거리는 BFS
를 사용하면 된다!!!!
dq = deque([(y, x)])
dq를 초기화 할 때는 항상 [] 연결리스트안에 tuple을 넣는 것이므로 위와 같은 방식으로 초기화하여야한다.
햇갈릴 때는 deque도 [] 리스트이다.
dq = deque([(y, x)])
dq = deque((y,x))
그래프표현방법
인접행렬
인접리스트