알고리즘 모음(C++)

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

백준

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

공대생의 잡다한 사전 2023. 1. 3. 20:10

문제 링크입니다. https://www.acmicpc.net/problem/24447

 

24447번: 알고리즘 수업 - 너비 우선 탐색 4

정점 1번에서 정점 2번, 정점 4번을 순서대로 방문한다. 정점 2번에서 정점 3번을 방문한다. 정점 5번은 정점 1번에서 방문할 수 없다. 따라서, ti 값은 1번 정점부터 1, 2, 4, 3, 0이다. 너비 우선 탐색

www.acmicpc.net

BFS 문제였습니다.

BFS 탐색을 할 때, 탐색 깊이와 탐색 순서를 저장해주는게 중요했던 문제입니다.

탐색 순서는 다른 정점을 방문할 때마다 1씩 증가하지만, 탐색 깊이는 이전 정점에서 1를 더한 값입니다.

두개를 잘 구분해주는게 중요합니다.

 

두 값을 곱한 뒤 더할 때는 int의 범위를 넘어가니 long long int 형식으로 변수를 선언해줘야 합니다.

 

 

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

#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
#define LL long long int 

using namespace std;

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

void bfs(){
    int cnt = 1; 
    memset(check, -1, sizeof(check));
    queue<int> q;
    q.push(R);
    check[R] = 0;
    Cnt[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;
                Cnt[xx] = ++cnt;
                q.push(xx);
            }
        }
    }
}

void solve(){
    LL ans = 0;
    for(int i = 1; i <= N; i++){
        sort(connect[i].begin(), connect[i].end());
    }
    bfs();
    for(int i = 1; i <= N; i++){
        ans += check[i] * Cnt[i];
    }
    cout << ans;
}

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;
}

 

 

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