www.acmicpc.net/problem/14496

 

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

+ Recent posts