일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- BFS
- 다이나믹프로그래밍
- dfs문제
- 알고리즘
- 삼성코테
- 포스코 교육
- TensorFlow Lite
- MCU 딥러닝
- tinyml
- 코테 문제
- sort
- 딥러닝
- 삼성역량테스트
- 그리디
- DP문제
- 초소형머신러닝
- dfs
- 자료구조
- 삼성역테
- 삼성코딩테스트
- 임베디드 딥러닝
- 영상처리
- tflite
- 컴퓨팅사고
- 포스코 ai 교육
- DP
- 코딩테스트
- bfs문제
- 포스코 AI교육
- 코테
- Today
- Total
코딩뚠뚠
[백준문제풀이] 18352 특정 거리의 도시 찾기 본문
풀이일시 : 2020-12-20
문제 :
어떤 나라에는 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는 서로 다른 자연수이다.
ex)
4 4 2 1
1 2
1 3
2 3
2 4
출력 :
X로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력한다.
이 때 도달할 수 있는 도시 중에서, 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력한다.
ex)
4
풀이 :
BFS를 이용해 풀이할 수 있다.
입력을 해준 후 시작하려는 점 X에서 BFS를 실행한다.
BFS내부에서 인접노드들을 탐색하며 방문하지 않은 노드이고, 시작하려는 점으로 돌아오지 않는 경우에 ++ 를 실행해 주고 큐에 넣어주는 과정을 반복한다.
이후 최소 방문거리가 K값과 일치한 값들만 출력해 주면 될것이다.
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> v[300001];
int dist[300001] = { 0, };
int n, m, k, x, z; //n:도시개수 m:도로갯수 k:최단거리여야되는 거리 x:특정도시
void bfs(int x) {
queue <int> q;
q.push(x);
while (!q.empty()) {
int nx = q.front();
q.pop();
for (int i = 0; i < v[nx].size(); i++) {
int z = v[nx][i];
if (dist[z] == 0&& z !=x ) { //탐색하지않은곳 && 시작점으로 돌아가지 않는 (돌아가면 0임)
dist[z] = dist[nx] + 1;
q.push(z);
}
}
}
}
//반례로 거리가 이미 3이 들어가있는 경우에 2인 거리가 최소로 들어오면?
int main() {
cin >> n >> m >> k >> x;
int i1, i2;
for (int i = 0; i < m; i++) {
cin >> i1 >> i2;
v[i1].push_back(i2);
}
bfs(x);
vector<int> answer;
for (int i = 1; i <= n; i++) {
if (dist[i] == k)
answer.push_back(i);
}
if (answer.size() == 0)
cout << -1 << endl;
else {
sort(answer.begin(), answer.end());
for (int i = 0; i < answer.size(); i++) {
cout << answer[i] << endl;
}
}
}
추가자료 : vector
추가자료 : sort
'알고리즘 문제풀이 > 백준문제풀이' 카테고리의 다른 글
[백준문제풀이] 1182 부분수열의 합 (0) | 2021.01.03 |
---|---|
[백준문제풀이] 6603 로또 (0) | 2021.01.03 |
[백준문제풀이] 2873 롤러코스터 (0) | 2021.01.02 |
[백준문제풀이] 1987 알파벳 (0) | 2021.01.02 |
[백준문제풀이] 2580 스도쿠 (0) | 2021.01.02 |