본문 바로가기
ALGORITHM/C++ - 백준

[백준 24446] 알고리즘 수업 - 너비 우선 탐색 3

by DDongYeop 2023. 10. 19.
728x90

문제

https://www.acmicpc.net/problem/24446

 

24446번: 알고리즘 수업 - 너비 우선 탐색 3

너비 우선 탐색 트리는 1, 2, 3, 4번 노드로 구성된다. 1번 노드가 루트이다. 1번 노드의 자식은 2, 4번 노드이다. 3번 노드는 2번 또는 4번 노드의 자식이다. 5번 노드는 1번 노드에서 방문 될 수 없다.

www.acmicpc.net

 

 

문제 분석

무방향 그래프를 만들고  시작 정점부터 BFS를 돌려준다. 

 

시작 정점을 0으로 다음으로 방문하는 노드는 1, 그다음은 2이렇게 1식 올라간 것을 출력한다. 여기서 방문하지 않은 노드는 -1로 표시한다. 

 

 

알고리즘 설계

정점의 수, 간선의 수, 시작 정점을 입력 받는다. 

 

어떤 노드끼리 연결되어 있는지 확인하기 위하여 이중vector graph를 만들고, 몇 번쨰에 방문했는지 알려줄 visited라는 vector을 하나 만들고, 각각 초기화 시켜준다. visited는 -1로 초기화 해준다. 

 

이후 BFS를 돌려 연결 되어 있으며 방문하지 않은 노드라면 그 노드로 BFS를 돌려준다. 

 

 

유의점

BFS를 이해하지 못 하였다면 어려울 수 있기에 충분히 이해된 상태에서 문제 푸는 것을 권장한다.

 

 

코드

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

void BFS(int index);

vector<vector<int>> graph;
vector<int> visited;
int n, m, v;

int main()
{
    int input1, input2;
    cin >> n >> m >> v;

    graph.resize(n + 1);
    visited = vector<int>(n + 1, -1);

    while (m--)
    {
        cin >> input1 >> input2;
        graph[input1].push_back(input2);
        graph[input2].push_back(input1);
    }

    for (int i = 1; i < graph.size(); ++i)
        sort(graph[i].begin(), graph[i].end());

    BFS(v);

    for (int i = 1; i < visited.size(); ++i)
        cout << visited[i] << '\n';
}

void BFS(int index)
{
    queue<int> que;
    que.push(index);
    visited[index] = 0;

    while (!que.empty())
    {
        int current = que.front();
        que.pop();

        for (int i : graph[current])
        {
            if (visited[i] != -1)
                continue;
            visited[i] = visited[current] + 1;
            que.push(i);
        }
    }
}
728x90

'ALGORITHM > C++ - 백준' 카테고리의 다른 글

[백준 16953] A → B  (0) 2023.10.19
[백준 7576] 토마토  (1) 2023.10.19
[백준 5635] 생일  (0) 2023.10.19
[백준 11047] 동전 0  (0) 2023.10.19
[백준 1991] 트리 순회  (0) 2023.10.19

댓글