코딩테스트
[백준] 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)