https://www.acmicpc.net/problem/14496
14496번: 그대, 그머가 되어
첫째 줄에 머호가 바꾸려 하는 문자 a와 b가 주어진다. 둘째 줄에 전체 문자의 수 N과 치환 가능한 문자쌍의 수 M이 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ M ≤ 10,000) 이후 M개의 줄에 걸쳐 치환 가능한 문
www.acmicpc.net
문제 설명
머호는 문자 a를 문자 b로 바꾸려고 한다.
N개의 문자와 치환 가능한 M개의 문자쌍이 있을 때, a를 b로 바꾸기 위한 치환의 최소 횟수를 구한다.
치환이 불가능한 경우는 -1를 출력한다.
N (1 <= N <= 1,000)
M (1 <= M <= 10,000)
해결
간단한 bfs 문제이다.
vector에 치환 가능한 문자열을 넣어 주고, 시작 문자 a로부터 모든 치환 가능한 문자들을 방문하며 b가 될 때까지 bfs를 돈다.
queue 안에는 현재 문자만 넣어 주고, 시간은 visited 배열의 숫자를 증가시켜 계산해 주었다.
코드
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
int a, b, c, d;
int n, m;
int visited[1001];
vector<int> v[1001];
int bfs() {
queue<int> q;
q.push(a);
visited[a] = 1;
while (!q.empty()) {
auto cur = q.front(); q.pop();
for (int i = 0; i < v[cur].size(); i++) {
if (visited[v[cur][i]]) continue;
if (v[cur][i] == b) return visited[cur];
visited[v[cur][i]] = visited[cur] + 1;
q.push(v[cur][i]);
}
}
return -1;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> a >> b;
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> c >> d;
v[c].push_back(d);
v[d].push_back(c);
}
if (a == b) {
cout << 0;
return 0;
}
cout << bfs();
}
'백준' 카테고리의 다른 글
[백준/c++] BOJ 25214 - 크림 파스타 (0) | 2023.10.12 |
---|---|
[백준/c++] BOJ 5558 - チーズ (Cheese) (0) | 2023.10.12 |
[백준/c++] BOJ 13913 - 숨바꼭질 4 (1) | 2023.10.05 |
[백준/c++] BOJ 14226 - 이모티콘 (1) | 2023.10.01 |
[백준/c++] BOJ 14923 - 미로 탈출 (1) | 2023.10.01 |