[백준/24480/파이썬(Python)] dfs, 알고리즘 수업 - 깊이 우선탐색2
24480번: 알고리즘 수업 - 깊이 우선 탐색 2 (acmicpc.net)
중요하게 볼 점
- 출력 : i번째 줄에는 정점 i의 방문 순서를 출력한다. 시작 정점에서 방문할 수 없는 경우 0을 출력한다.
- 입력 : 간선의 개수만큼 입력받는다.
- 문제 : 인접 정점은 내림차순으로 방문한다.
코드
from sys import stdin,setrecursionlimit
input = stdin.readline
count = 0
def dfs(graph, visited, start):
global count
count+=1
visited[start] = count
for i in graph[start]: # 그래프 집합에서
if visited[i] == False: #방문하지 않은 경우,
dfs(graph, visited, i)
# 입력 #
N, M, R = map(int, input().split())
setrecursionlimit(N+10) # 재귀 깊이 늘리기
#---1번 정점부터 시작한다. --#
# 방문한 곳
visited = [False] * (N+1)
#그래프 ( 정점 집합)
graph = [[]for i in range(N+1)]
# -- 연결하기 -- #
for i in range(M): # 간선의 수 만큼 반복
u,v = map(int, input().split()) # u,v 입력받기
graph[u].append(v) # u,v 서로 연결
graph[v].append(u) # u,v 서로 연결
# -- 내림차순 정렬 -- #
for i in range(1,N+1):
graph[i].sort(reverse=True)
# -- dfs -- #
dfs(graph, visited, R)
for i in range(1, N+1):
if visited[i] != False :
print(visited[i])
else:
print(0)
풀이
- 의사코드대로 dfs를 구현한다. 여기서 dfs할때마다 count를 증가시켜서 바로 visited[] 리스트에 몇번째로 도착했는지에 대한 값 count를 넣어준다.
- global 키워드를 이용하여, 함수 밖 count를 전역변수(global)로 선언하여 함수 안에서 쓸 수 있도록 받아왔다.
- setrecursionlimit()를 이용하여 재귀의 깊이를 늘려준다.
- 정점 연결하기 : graph[u], graph[v] 번째 정점을 각각 연결해준다.
- 내림차순 정렬 : graph[]의 각 리스트를 내림차순 정렬해준다.
- dfs 실행
- 출력 : 1부터 N+1 까지 하여, visited[]함수에서 있는 값이 False이 아니면 출력하고, False이면 0을 출력한다.
결과
'코딩테스트 > 파이썬' 카테고리의 다른 글
[백준/24483/파이썬] 알고리즘 수업 - 깊이 우선 탐색 5 (dfs,Python) (0) | 2023.03.15 |
---|---|
[백준/1138/파이썬(Python)] 한 줄로 서기 (구현) (0) | 2023.03.14 |
[백준/24479/파이썬(Python)] DFS, 알고리즘수업-깊이우선탐색1 (0) | 2023.03.06 |
[백준/11279/파이썬(Pyhon)] 최대 힙 / heapq함수로 최대 힙 구현 (0) | 2023.02.26 |
[백준/1541/파이썬(Python)] 잃어버린 괄호 | 그리디 알고리즘 (0) | 2023.02.24 |
댓글