알고리즘 모음(C++)

백준 24446 - 알고리즘 수업 - 너비 우선 탐색 3(C++) 본문

백준

백준 24446 - 알고리즘 수업 - 너비 우선 탐색 3(C++)

공대생의 잡다한 사전 2023. 1. 3. 19:52

문제 링크입니다. 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 문제였습니다.

양방향 그래프와 시작점이 주어질 때, 1~N번까지 깊이를 구하는 문제입니다.

 

저는 check 배열을 하나 만들었습니다.

check 배열의 값을 전부 -1로 초기화한 뒤, X번이 탐색될 때마다 연결된 정점의 check 값에서 1 더한 값을 저장해줍니다.

 

탐색이 모두 끝난 뒤, check 배열의 값을 출력해주면 됩니다.

 

 

자세한 것은 코드를 참고해주세요

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cmath>
#define P pair<int, int>
#define F first
#define S second

using namespace std;

int N, M, R;
vector<int> connect[100001];
int check[100001];

void bfs(){
    memset(check, -1, sizeof(check));
    queue<int> q;
    q.push(R);
    check[R] = 0;
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(int i = 0; i < connect[x].size(); i++){
            int xx = connect[x][i];
            if(check[xx] == -1){
                check[xx] = check[x] + 1;
                q.push(xx);
            }
        }
    }
}

void solve(){
    bfs();
    for(int i = 1; i <= N; i++) cout << check[i] << "\n";
}

int main() {
    cin.tie(0);
    cout.tie(0);
    cin >> N >> M >> R;
    for(int i = 1; i <= M; i++){
        int x, y;
        cin >> x >> y;
        connect[x].push_back(y);
        connect[y].push_back(x);
    }
    solve();
    return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요