2644
백준 2644번
Link: 2644번: 촌수계산
문제 설명
역시나 BFS문제.
저번에 풀었던 토마토 문제처럼, 이 문제도 트리 내에서 출발지와 목적지를 설정하여 목적지까지 도달하는데 거치는 트리 레벨을 세면 되는 문제였다.
주의해야할 점은 방향이 없는 그래프 문제였다는 점.
이외에는 다소 평이했던 문제였다…
라고 하기에는 막판에 뻘짓을 좀 했다.
도달할 수 없는 경우 -1로 처리하는 부분에서 살짝 헤맸던 것 빼고는 할만한 문제였다.
정답 코드
//
// Created by Keith_Lee on 28/01/2019.
//
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int map[101][101] = {0, };
bool visit[101][101] = {false, };
int n;
int BFS(int start, int end){
int result = 0;
queue<int> Queue;
Queue.push(start);
while(!Queue.empty()){
vector<int> available;
while(!Queue.empty()) {
available.push_back(Queue.front());
Queue.pop();
}
for(int i=0; i<available.size(); i++) {
int current = available[i];
for (int j = 1; j <= n; j++) {
if (map[current][j] == 1 && !visit[current][j]) {
visit[current][j] = true;
visit[j][current] = true;
Queue.push(j);
}
}
}
result++;
for(int i=1; i<=n; i++){
if(visit[end][i] && visit[i][end]){
return result;
}
}
}
}
int main(){
cin >> n;
int start, end;
cin >> start >> end;
int m;
cin >> m;
for(int i=0; i<m; i++){
int x, y;
cin >> x >> y;
map[x][y] = 1;
map[y][x] = 1;
}
int result = BFS(start, end);
bool find = false;
for(int i=1; i<=n; i++){
if(visit[end][i] && visit[i][end]){
find = true;
}
}
if(!find){
result = -1;
}
cout << result << '\n';
return 0;
}