14496번: 그대, 그머가 되어
첫째 줄에 머호가 바꾸려 하는 문자 a와 b가 주어진다. 둘째 줄에 전체 문자의 수 N과 치환 가능한 문자쌍의 수 M이 주어진다. (1 <= N <= 1,000, 1 <= M <= 10,000) 이후 M개의 줄에 걸쳐 치환 가능한 문자쌍
www.acmicpc.net
- 문제 설명은 굉장히 현란하지만, 결국 잘 읽어보면 최단거리를 구하는 문제이다.
- 그래프에서 에지의 가중치가 없고 전부 1이기 때문에, 단순한 BFS 문제로 생각하고 풀면 바로 풀 수 있다.
- 문제에서 노드들이 양방향으로 연결된다는 말은 없었는데, 예제 2번을 통해 유추하면 될 것 같다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int a, b, N, M, cnt;
int u, v;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> a >> b >> N >> M;
vector<int> graph[N + 1]; // 엣지 리스트
vector<bool> visited(N + 1, false); // 중복 방문 피하기 위한 배열
for(int i = 0 ; i < M ; i++)
{
cin >> u >> v;
graph[u].push_back(v); // 양방향으로 연결
graph[v].push_back(u);
}
queue<int> q;
q.push(a); // 주어진 a 부터 시작해서
visited[a] = true;
while(q.size())
{
int sz = q.size();
for(int k = 0 ; k < sz ; k++) // 같은 너비에 있는 친구는 한번에 다같이 처리
{
int cur = q.front();
q.pop();
if(cur == b)
{
cout << cnt << endl;
return 0;
}
for(int i = 0 ; i < graph[cur].size() ; i++) // 자신에게 연결된 노드들 중
{
int next = graph[cur][i];
if(!visited[next]) // 방문하지 않은 노드에 대해서 푸시해주고
{
q.push(next);
visited[next] = true; // 방문처리를 미리 해줌
}
}
}
cnt++;
}
cout << -1 << endl;
}
'PS > BOJ' 카테고리의 다른 글
[백준] 10452 : 피보나치 인버스 (0) | 2021.02.11 |
---|---|
[백준] 2841 : 외계인의 기타 연주 (0) | 2021.02.10 |
[백준] 1406 : 에디터 (0) | 2021.01.23 |
[백준] 1374 : 강의실 (0) | 2021.01.22 |
[백준] 3258 : 컴포트 (0) | 2021.01.21 |