※주의※
저의 풀이가 정답은 아닙니다.
다른 코드가 더 효율적이거나 좋을 수 있습니다.
언제나 다른 사람의 코드는 참고만 하시기 바랍니다.
[문제 풀이 사이트]
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=4, K=2, X=1일 때 다음과 같이 그래프가 구성되어 있다고 가정하자.
이 때 1번 도시에서 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 2인 도시는 4번 도시 뿐이다. 2번과 3번 도시의 경우, 최단 거리가 1이기 때문에 출력하지 않는다.
[입력]
첫째 줄에 도시의 개수 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을 출력한다.
[입출력 예]
입력 | 출력 |
4 4 2 1 1 2 1 3 2 3 2 4 |
4 |
4 3 2 1 1 2 1 3 1 4 |
-1 |
4 4 1 1 1 2 1 3 2 3 2 4 |
2 3 |
[문제 풀이]
출발 도시가 주어지고 출발도시에서 각 도시 별 거리를 구해야한다.
이 문제는 양방향 그래프가 아닌 단방향 그래프이고, 도시간 가중치가 1이다.
그래서 bfs 또는 다익스트라로 풀 수 있다.
[최종 코드]
[GitHub]
GitHub - SmallPeanutPark/BAEKJOON: Study BaekJoon for Coding Test
Study BaekJoon for Coding Test. Contribute to SmallPeanutPark/BAEKJOON development by creating an account on GitHub.
github.com
#include <bits/stdc++.h>
using namespace std;
vector<int> graph[3000001];
int dist[3000001];
void bfs(int cur) {
queue<int> q;
q.push(cur);
dist[cur] = 0;
while(!q.empty()) {
int cur_node = q.front();
q.pop();
for(int element : graph[cur_node]) {
if(dist[element] != -1) continue;
q.push(element);
dist[element] = dist[cur_node] + 1;
}
}
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N, M, K, X; // 도시의 개수, 도로의 개수, 거리 정보, 출발 도시의 번호
cin >> N >> M >> K >> X;
for(int i = 0; i < M; ++i) {
int city1, city2;
cin >> city1 >> city2;
graph[city1].emplace_back(city2);
}
fill(dist, dist + 3000001, -1);
bfs(X);
vector<int> ans;
for(int i = 1; i <= N; ++i) {
if(dist[i] == K) {
ans.emplace_back(i); // 최단 거리 K인 모든 도시 저장
}
}
if(ans.empty()) {
cout << -1;
} else {
sort(ans.begin(), ans.end()); // 오름 차순 정렬
for(int element : ans) {
cout << element << '\n';
}
}
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[BaekJoon 2011번] 암호코드(C++) (0) | 2022.08.30 |
---|---|
[BaekJoon 1629번] 곱셈(C++) (0) | 2022.08.29 |
[BaekJoon 1717번] 집합의 표현(C++) (0) | 2022.08.28 |
[BaekJoon 11779번] 최소비용 구하기 2(C++) (0) | 2022.08.25 |
[BaekJoon 1753번] 최단경로(C++) (0) | 2022.08.22 |
댓글