코딩테스트

[백준] 1389번 케빈 베이컨의 6단계 법칙

스키(ski) 2022. 8. 28. 18:33
문제 내용

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

 

1389번: 케빈 베이컨의 6단계 법칙

첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻

www.acmicpc.net

 

해결 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <queue>
#include <string.h> //memset을 위한 header 파일
 
#define MAX_N 101
 
using namespace std;
 
int n, m;
bool arr[MAX_N][MAX_N]; //
bool visited[MAX_N];    //노드 방문 확인용 배열
 
int BFS(int a) {
    queue<int> q;
    int level = 0
    int sum = 0//방문한 노드들의 level의 합
 
    q.push(a);
    visited[a] = true;
 
    while (!q.empty()) {
        int sz = q.size();
        for (int i = 0; i < sz; i++) {
            int fr = q.front();
            q.pop();
 
            sum += level;
 
            for (int k = 1; k <= n; k++) {
                if (arr[fr][k] && !visited[k]) {
                    q.push(k);
                    visited[k] = true;
                }
            }
        }
        level++;
    }
 
    return sum;
}
 
int main() {
    int idx; //최소 값을 가지는 유저 넘버 
    int max = 20000//해당 유저의 수
 
    cin >> n >> m;
 
    while (m--) {
        int a, b;
        cin >> a >> b;
        arr[a][b] = true;
        arr[b][a] = true;
    }
 
    for (int i = 1; i <= n; i++) {//1부터 n까지의 시작지점 설정
        int sum = BFS(i);
 
        if (sum < max) {
            idx = i;
            max = sum;
        }
        
        memset(visited, false, (n + 1* sizeof(bool));
    }
 
    cout << idx;
}
 
cs
사용 개념 

그래프 탐색: 너비우선탐색(BFS, Breadth-First Search)