#1. 문제
https://www.acmicpc.net/problem/2644
#2. 풀이
1. BFS 최단 경로
BFS는 그래프의 모든 정점을 탐색하는 방법 중 하나로, 현재 정점의 인접한 정점들을 우선 탐색하는 방법입니다. 일반적으로, BFS는 큐 자료구조를 활용하여 구현합니다.
최단 경로 알고리즘은 가중치 그래프에서 두 정점 사이의 경로들 중 가중치의 합이 최소가 되는 경로를 찾는 알고리즘입니다. 이때, 음수 가중치를 갖는 간선이 없고, 모든 간선의 가중치가 없거나 동일하며, 단일-쌍의 최단 경로 값을 찾기 위해 BFS를 활용합니다.
2. LCA를 하기엔 쿼리가 한 개뿐이라서, BFS 최단 경로를 활용하자!
- 먼저, 주어진 문제에서 그래프는 무 방향성, 그리고 무 가중치 그래프이기 때문에, 단일-쌍 최단 경로 값을 찾기에 적합한 BFS 최단 경로 알고리즘을 활용합니다.
#3. 코드
/*
@링크: https://www.acmicpc.net/problem/2644
* @문제: 2644, 촌수 계산
* @설명
1. BFS
2. 해당 문제는 쿼리가 1개 뿐이라서, LCA의 전처리 과정이 오버헤드가 될 수 있다.
*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n, m;
int A, B;
vector<vector<int>> graph;
vector<bool> visited;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
cin >> A >> B;
cin >> m;
//@그래프 초기화
graph.resize(n+1);
visited.resize(n+1, false);
//@그래프 구성 (무방향)
for(int i = 0; i < m; i++)
{
int x, y;
cin >> x >> y;
graph[x].push_back(y);
graph[y].push_back(x);
}
//@BFS
queue<pair<int, int>> q;
q.push({A, 0});
visited[A] = true;
while(!q.empty())
{
int cur = q.front().first;
int dist = q.front().second;
q.pop();
if(cur == B)
{
cout << dist;
return 0;
}
for(const auto neighbor : graph[cur])
{
if(!visited[neighbor])
{
visited[neighbor] = true;
q.push({neighbor, dist + 1});
}
}
}
//@경로가 없는 경우
cout << -1;
return 0;
}
'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글
[BOJ, C++]#1976_여행 가자, BFS, 그래프 탐색 (4) | 2024.09.24 |
---|---|
[BOJ, C++]#1368_물 대기, 최소 스패닝 트리, 최소 신장 트리, 크루스칼, 최소 신장 트리의 가상 노드, 가상 노드 활용 (0) | 2024.09.20 |
[BOJ, C++]#14426_접두사 찾기, 검색 트리, Trie 자료 구조, Trie 검색 트리, 트리 (0) | 2024.09.12 |
[BOJ, C++]#2630_색종이 만들기, 분할-정복, divide-and-conquer, 재귀 호출 (0) | 2024.09.12 |
[BOJ, C++]#15683_감시, 미로 유형 문제, 백트래킹, DFS (0) | 2024.09.03 |