hwooo
BOJ (C/C++) 14496번: 그대, 그머가 되어 본문
https://www.acmicpc.net/problem/14496
14496번: 그대, 그머가 되어
첫째 줄에 머호가 바꾸려 하는 문자 a와 b가 주어진다. 둘째 줄에 전체 문자의 수 N과 치환 가능한 문자쌍의 수 M이 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ M ≤ 10,000) 이후 M개의 줄에 걸쳐 치환 가능한 문
www.acmicpc.net


풀이
최소 횟수를 구해야 하므로 BFS를 이용, 탐색하면서 원하는 문자가 나올 경우 해당 지점까지의 바꾼 횟수 반환.큐가 비워졌음에도(모든 노드를 탐색했음에도) 함수가 끝나지 않았을 경우 문자를 바꿀 수 없음 -> -1 반환바꾸려는 문자가 동일한 경우는 예외처리 해줘야 함방문했던 노드는 표기해줘서 여러 번 방문하지 않도록 처리
코드
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
queue <pair<int, int>> Q;
vector <int> V[1001];
bool visited[1001];
int BFS(int end) {
int now, cnt;
while (!Q.empty()) {
now = Q.front().first, cnt = Q.front().second;
Q.pop();
for (int i : V[now]) {
// 이미 방문했던 간선 표기
if (visited[i]) continue;
visited[i] = true;
// 원하는 지점에 도달했을 때 방문 횟수 return
if (i == end) return cnt;
else Q.push({ i,cnt + 1 });
}
}
// 바꿀 수 없는 경우 -1 return
return -1;
}
int main() {
int a, b, N, M, i, j;
// input
scanf("%d %d", &a, &b);
// 바꾸려는 문자가 동일한 경우
if (a == b) {
printf("0");
return 0;
}
scanf("%d %d", &N, &M);
for (int m = 0; m < M; m++) {
scanf("%d %d", &i, &j);
V[i].push_back(j);
V[j].push_back(i);
}
// 큐에 시작지점 삽입
Q.push({ a,1 });
printf("%d", BFS(b));
return 0;
}
'Study > Algorithm' 카테고리의 다른 글
| BOJ (C/C++) 2745번: 진법 변환 (0) | 2023.04.27 |
|---|---|
| BOJ (C/C++) 9205번: 맥주 마시며 걸어가기 (0) | 2023.04.26 |
| BOJ (C/C++) 3055번: 탈출 (0) | 2023.03.25 |
| BOJ (C/C++) 2156번: 포도주 시식 (0) | 2023.03.23 |
| BOJ (C/C++) 1707번: 이분 그래프 (0) | 2023.03.23 |