두 로봇(BOJ15971)
2024. 11. 18. 14:44ㆍBOJ/BFS,DFS
문제

문제 설명
- 모든 동굴은 통로로 연결되어 있다.
- 이때 로봇은 인접한 동굴에 위치하게 된다면 통신이 가능하게 된다.
- 동굴사이를 이동하기 위해서는 특정 길이의 통로를 통과해야 한다.
- 최소한의 길이로 이동하도록 코드를 작성하시오.
문제 해설
- bfs
기본적으로 A동굴에서 B동굴로 이동하는 경로는 한 가지밖에 존재하지 않는다.
또한 A-B로 이동하는 경로 어디에서든지 만나도 상관이 없다.
ex) 1-3-5-7의 경로가 있다고 할 때 동굴 1,3에서 만나도 상관없고, 3,5에서 만나도 상관없음.
즉 경로를 이동하면서 통로의 길이를 모두 더해준 다음, 제일 긴 경로를 빼주면 된다.
최종 코드
#include <bits/stdc++.h>
using namespace std;
struct P {int a, sum, mx;};
int n, a, b;
int visited[100004];
vector<pair<int, int>> v[100004];
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin >> n >> a >> b;
for (int i = 1; i <= n; i++) {
int x, y, z;
cin >> x >> y >> z;
v[x].push_back({y, z});
v[y].push_back({x, z});
}
queue<P> q;
q.push({a, 0, 0});
visited[a] = 1;
while (!q.empty()) {
int x = q.front().a; #로봇의 현제 위치
int sum = q.front().sum; #지금 까지 이동하면서 통과한 통로 길이의 총합
int mx = q.front().mx; #지금 까지 이동한 통로중 가장 긴 통로의 길이
q.pop();
if (x == b) { #도착하면 총합-제일 긴 통로!
cout << sum - mx;
return 0;
}
for (auto [y, d] : v[x]) {
if (!visited[y]) {
visited[y] = 1;
q.push({y, sum + d, max(mx, d)}); #일반적인 bfs 탐색(?)
}
}
}
}
'BOJ > BFS,DFS' 카테고리의 다른 글
| 게임(BOJ1103) (0) | 2024.11.21 |
|---|---|
| 열쇠(BOJ9328) (0) | 2024.11.20 |
| 섬의 개수(BOJ4943) (1) | 2024.11.16 |
| 게리맨더링(BOJ 17471) (0) | 2024.11.15 |
| 벽 부수고 이동하기 4 (0) | 2024.08.17 |