※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 5214번 문제인 환승이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/5214
5214번: 환승
첫째 줄에 역의 수 N과 한 하이퍼튜브가 서로 연결하는 역의 개수 K, 하이퍼튜브의 개수 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ K, M ≤ 1000) 다음 M개 줄에는 하이퍼튜브의 정보가 한 줄에 하나씩 주어
www.acmicpc.net
문제의 답은 각 하이퍼튜브를 노드로, 서로 환승할 수 있는 관계에 있는 하이퍼튜브 사이의 관계를 에지로 모델링한 그래프 위에서 1번 역이 들어있는 하이퍼튜브(들)로부터 N번 역이 들어있는 하이퍼튜브(들)까지의 거리를 BFS를 이용해 계산해낼 수 있다.
각 역을 지나는 하이퍼튜브들의 목록을 담은 벡터와 각 하이퍼튜브에 포함된 역들의 목록을 담은 벡터를 이용해 중복되는 탐색을 최소화하는 방향으로 구현하고 문제를 해결하자.
별해로 각 역들과 각 하이퍼튜브들을 전부 노드로, 역과 하이퍼튜브의 포함관계를 에지로 모델링한 그래프를 이용해도 문제를 해결할 수 있다.
N이 1로 주어지는 코너케이스에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int S, K, T;
vector<int> tube[100001]; // [s]: s번 역이 들어있는 튜브들을 담은 벡터
vector<int> stn[1001]; // [t]: t번 튜브에 들어있는 역들을 담은 벡터
int tubedist[1001];
bool stnvisited[100001];
void bfs() {
queue<int> que;
for (auto& t : tube[1]) tubedist[t] = 2, que.push(t);
while (!que.empty()) {
int curt = que.front(); que.pop();
for (auto& s : stn[curt]) {
if (stnvisited[s]) continue;
stnvisited[s] = 1;
for (auto& t : tube[s]) {
if (tubedist[t]) continue;
tubedist[t] = tubedist[curt] + 1;
que.push(t);
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> S >> K >> T;
if (S == 1) {
cout << 1;
return 0;
}
for (int t = 1; t <= T; t++) {
for (int k = 0; k < K; k++) {
int s; cin >> s;
stn[t].emplace_back(s);
tube[s].emplace_back(t);
}
}
bfs();
int ans = 1000000007;
for (auto& t : tube[S]) {
ans = min(ans, tubedist[t]);
}
if (0 < ans && ans < 1000000007) cout << ans;
else cout << -1;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 10711 // C++] 모래성 (0) | 2023.07.02 |
---|---|
[BOJ 17136 // C++] 색종이 붙이기 (0) | 2023.07.01 |
[BOJ 5213 // C++] 과외맨 (0) | 2023.06.29 |
[BOJ 16681 // C++] 등산 (0) | 2023.06.28 |
[BOJ 1398 // C++] 동전 문제 (0) | 2023.06.27 |