Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 백준 2261번
- 백준 2812번
- 위상 정렬(Topology Sort)
- 그래프(Graph)
- 백준 21606번
- DFS(Depth First Search)
- 트리(Tree)
- 백준 1707번
- 그리디 알고리즘(Greedy Algorithm)
- 백준 2504번
- 백준 18352번
- BFS
- 알고리즘 개념
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 백준 1948번
- 위상 정렬(Topological Sort)
- DFS & BFS
- 이분 그래프(Bipartite Graph)
- 백준 10000번
- 스택(Stack)
- DFS
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 동적 프로그래밍(Dynamic Programming)
- 백준 17608번
- 분할 정복(Divide and Conquer)
- 백준 9012번
- 큐(Queue)
- 이분 탐색(Binary Search)
- 백준 2493번
- BFS(Breadth First Search)
Archives
- Today
- Total
Always Be Wise
BFS : 특정 거리의 도시 찾기(백준 18352번) 본문
728x90
▶ 문제 : https://www.acmicpc.net/problem/18352
18352번: 특정 거리의 도시 찾기
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개
www.acmicpc.net
##### 문제 #####
# 어떤 나라에는 1번부터 N번까지의 도시와 M개의 단방향 도로가 존재한다.
# 모든 도로의 거리는 1이다.
# 이때 특정한 도시 X로부터 출발하여 도달할 수 있는 모든 도시 중에서,
# 최단 거리가 정확히 K인 모든 도시들의 번호를 출력하는 프로그램을 작성하시오.
# 또한 출발 도시 X에서 출발 도시 X로 가는 최단 거리는 항상 0이라고 가정한다.
##### 입력 #####
# 첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다.
# (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N)
# 둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 공백을 기준으로 구분되어 주어진다.
# 이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미다. (1 ≤ A, B ≤ N)
# 단, A와 B는 서로 다른 자연수이다.
##### 출력 #####
# X로부터 출발하여 도달할 수 있는 도시 중에서,
# 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력한다.
# 이 때 도달할 수 있는 도시 중에서, 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력한다.
▶ 접근 방법
문제 요구 사항을 반영하여 그래프를 만들 시, 해당 그래프가 단방향 그래프라는 것에 주목해야 한다.
특정 정점에서 단방향으로만 간선이 존재하기에 이를 고려하여 구현해야 한다.
▶ 풀이 코드
import sys
from collections import deque
# N = 도시의 개수, M = 도로의 개수
# K = 거리 정보, X = 출발 도시
N, M, K, X = map(int, sys.stdin.readline().split())
# 전체 도시의 수를 고려하여 adj_graph 리스트를 만들어준다.
adj_graph = [[] for _ in range(N+1)]
# 전체 도로의 수만큼 반복하면서
for _ in range(M):
# 도시의 연결 여부를 adj_graph의 인덱스를 이용하여 표현한다.
vertex_1, vertex_2 = map(int, sys.stdin.readline().split())
adj_graph[vertex_1].append(vertex_2)
print(adj_graph)
# 방문 여부를 표시할 리스트를 만들어준다.
visited = [False] * (N + 1)
# 출발 도시에서 각 도시별 거리를 나타내는 리스트를 만들어준다.
distance = [0] * (N + 1)
def BFS(start):
cities = []
# queue를 하나 만들어주고, 출발 도시를 넣어준다.
queue = deque()
queue.append(start)
# 출발 도시에 방문 표시를 해준다.
visited[start] = True
# 출발 도시에서 출발 도시까지의 거리는 0이다.
distance[start] = 0
# queue가 존재하는 동안
while queue:
# queue에서 하나를 꺼내 current_city 변수에 넣어준다.
current_city = queue.popleft()
# current_city의 인접 도시를 하나씩 살펴본다.
for adj_city in adj_graph[current_city]:
# 인접 도시를 방문하지 않았다면
if not visited[adj_city]:
# 인접 도시 방문 표시를 해주고
visited[adj_city] = True
# queue에 넣어준다.
queue.append(adj_city)
# 거리도 표시해준다. 이때 거리는 출발 도시부터의 누적 거리다.
distance[adj_city] = distance[current_city] + 1
# 거리가 K라면 해당 도시를 cities에 넣어준다.
if distance[adj_city] == K:
cities.append(adj_city)
if cities:
cities.sort()
for city in cities:
print(city)
else:
print(-1)
BFS(X)
▶ 관련 링크
2021.11.18 - [알고리즘] - DFS(Depth First Search, 깊이 우선 탐색)이란?
2021.11.18 - [알고리즘] - BFS(Breadth First Search, 너비 우선 검색)이란?
2021.11.19 - [알고리즘] - 그래프(Graph)란?
2021.11.19 - [알고리즘] - DFS & BFS : DFS와 BFS(백준 1260번)
2021.11.19 - [알고리즘] - DFS & BFS : 연결 요소의 개수(백준 11724번)
2021.11.19 - [알고리즘] - DFS & BFS : 바이러스(백준 2606번)
2021.11.19 - [알고리즘] - DFS & BFS : 미로 탐색(백준 2178번)
'알고리즘 > 백준' 카테고리의 다른 글
BFS : 미로만들기(백준 2665번) (0) | 2021.11.20 |
---|---|
BFS : 최소비용 구하기(백준 1916번) (0) | 2021.11.19 |
BFS : 미로 탐색(백준 2178번) (0) | 2021.11.19 |
DFS & BFS : 바이러스(백준 2606번) (0) | 2021.11.19 |
DFS & BFS : 연결 요소의 개수(백준 11724번) (0) | 2021.11.19 |
Comments