문제링크 : 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
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
int N, M, K, X; //도시 갯수, 도로 갯수, 거리 정보, 출발 도시 번호
int dist[300001];
vector<int>v[300001];
vector<int>result;
void dijkstra(int start)
{
dist[start] = 0;
queue<int>q;
q.push(start);
while(!q.empty())
{
int cur = q.front();
q.pop();
for(int i=0; i<v[cur].size(); i++)
{
int next = v[cur][i];
if(dist[next] > dist[cur] + 1) //모든 도로의 거리는 1
{
dist[next] = dist[cur] + 1;
q.push(next);
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M >> K >> X;
fill(dist+1, dist+(N+1), MAX); //무한대로 초기화
for(int i=0; i<M; i++)
{
int a, b;
cin >> a >> b;
v[a].push_back(b);
}
dijkstra(X);
for(int i=1; i<=N; i++)
{
if(dist[i] == K)
{
result.push_back(i);
}
}
if(result.empty()) cout << -1;
else
{
for(int i=0; i<result.size(); i++)
{
cout << result[i] << "\n";
}
}
return 0;
}
다익스트라문제다.
원래 가중치가 따로 있어서 비용도 개별로 저장해줘야 하나, 이번 문제에서 모든 도로의 거리가 1이므로 가중치 더하는 부분에서 1만 더해주면 된다.
이렇게 거리 정보를 저장한 뒤 우리가 찾는 거리 정보가 K인 경우만 출력해주면 된다.
출력에 줄바꿈을 빼먹어서 여러번 틀렸다..
'백준 > 실버' 카테고리의 다른 글
[백준 11497번] 통나무 건너뛰기 (C++) (0) | 2023.04.30 |
---|---|
[백준 10158번] 개미 (C++) (0) | 2023.04.28 |
[백준 15903번] 카드 합체 놀이 (C++) (0) | 2023.04.24 |
[백준 1991번] 트리 순회 (C++) (0) | 2023.04.21 |
[백준 9465번] 스티커 (C++) (0) | 2023.04.18 |