매일 BOJ
(매일 BOJ) C++ 18352번 특정 거리의 도시 찾기
norepinephrine
2025. 9. 3. 23:43
이번 문제는 18352번 특정 거리의 도시 찾기이다

문제 요약
- 입력
- N(도시 수), M(도로 수), K(목표 거리), X(시작 도시)
- M개의 도로: a -> b (단방향)
- 출력
- X로부터 최단거리가 정확히 K인 도시 번호들을 오름차순으로 출력
- 없다면 -1
접근 아이디어
- dist[v] = 시작점 X에서 v까지의 최단거리를 저장하는 BFS를 수행
- 방문하지 않았던 정점만 방문(dist == -1)
- 거리 갱신 직후 dist[next] == K이면 answer에 담아둔 후 최종적으로 answer를 정렬해 출력하면 끝
작성코드
#include <bits/stdc++.h>
using namespace std;
int N,M,K,X;
void BFS(vector<vector<int>> & city,vector<int> & answer);
int main (void){
cin >> N >> M >> K >> X;
vector<vector<int>> city(N+1);
for(int i = 1; i <= M; i++){
int a,b;
cin >> a >> b;
city[a].push_back(b);
}
vector<int> answer;
BFS(city,answer);
sort(answer.begin(),answer.end());
if(answer.empty()) {
cout << -1 << '\n';
return 0;
}
else{
for(int i : answer){
cout << i << '\n';
}
return 0;
}
}
void BFS(vector<vector<int>> & city,vector<int> & answer){
vector<int> distance(N+1,-1);
queue<int> q;
q.push(X);
distance[X] = 0;
while(!q.empty()){
int current = q.front();
q.pop();
for(int next : city[current]){
if(distance[next] == -1){
q.push(next);
distance[next] = distance[current] + 1;
if(distance[next] == K) answer.push_back(next);
}
}
}
}