문제
어떤 나라에는 1번부터 N번까지의 도시와 M개의 단방향 도로가 존재한다. 모든 도로의 거리는 1이다
X로부터 출발하여 도달할 수 있는 도시 중, 최단 거리가 K인 도시의 번호 출력, 없으면 -1 출력
생각할 것
모든 도로의 거리가 1이므로 가중치가 모두 동일하다!
따라서 BFS를 사용하면 된다
코드
1. BFS
BFS는 그냥 큐를 이용한다! 한번씩만 업데이트하므로 visited대신 dist가 INF인지 확인하면 된다.
#include <iostream>
#include <vector>
#include <queue>
#define INF 1e9
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M, K, X, A, B;
cin >> N >> M >> K >> X;
vector<vector<int>> adj(N + 1);
for (int i = 0; i < M; i++) {
cin >> A >> B;
adj[A].push_back(B);
}
queue<int> q;
vector<int> dist(N + 1, INF);
q.push(X);
dist[X] = 0;
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int i = 0; i < adj[cur].size(); i++) {
int next = adj[cur][i];
if (dist[next] != INF) continue;
dist[next] = dist[cur] + 1;
q.push(next);
}
}
int count = 0;
for (int i = 1; i <= N; i++) {
if (dist[i] == K) {
cout << i << "\\n";
count++;
}
}
if (count == 0) cout << -1;
return 0;
}
2. 다익스트라
다익스트라는 우선순위 큐를 사용한다. (이 문제에서는 가중치가 없어서 필요 없지만..!)
#include <iostream>
#include <vector>
#include <queue>
#define INF 1e9
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M, K, X, A, B;
cin >> N >> M >> K >> X;
vector<vector<int>> adj(N + 1);
for (int i = 0; i < M; i++) {
cin >> A >> B;
adj[A].push_back(B);
}
priority_queue<int> pq;
vector<int> dist(N + 1, INF);
pq.push(X);
dist[X] = 0;
while (!pq.empty()) {
int cur = pq.top();
pq.pop();
for (int i = 0; i < adj[cur].size(); i++) {
int next = adj[cur][i];
if (dist[next] > dist[cur] + 1) {
dist[next] = dist[cur] + 1;
pq.push(next);
}
}
}
int count = 0;
for (int i = 1; i <= N; i++) {
if (dist[i] == K) {
cout << i << "\\n";
count++;
}
}
if (count == 0) cout << -1;
return 0;
}
반응형
'Problem solving > BOJ' 카테고리의 다른 글
[BOJ] 11403. 경로 찾기 (C++) (0) | 2023.07.25 |
---|---|
[BOJ] 14567. 선수과목 (Prerequisite) (C++) (0) | 2023.07.24 |
[BOJ] 1197. 최소 스패닝 트리 (C++) (0) | 2023.07.22 |
[BOJ] 11870. 플로이드2 (C++) (0) | 2023.07.21 |