728x90
SMALL
백준 문제 풀이: 1389 [케빈 베이컨의 6단계 법칙]
문제 링크: https://www.acmicpc.net/problem/1389
문제 설명:
그래프에서 각 노드 간의 최단 거리를 구하고, 특정 노드에서 다른 모든 노드까지의 거리를 합산한 값(케빈 베이컨 수)이 가장 작은 노드를 출력하는 프로그램을 작성하세요.
입력 조건:
- 첫째 줄에 사용자 수 n과 친구 관계 수 m이 주어집니다. (2 ≤ n ≤ 100, 1 ≤ m ≤ 5000)
- 둘째 줄부터 m개의 줄에 친구 관계가 주어집니다. 각 줄에는 두 정수 a와 b가 주어지며, 이는 a와 b가 친구임을 의미합니다.
출력 조건:
- 케빈 베이컨 수가 가장 작은 사용자 번호를 출력합니다. 답이 여러 개라면 번호가 가장 작은 사용자를 출력합니다.
문제 해결 코드
#include <iostream>
#include <algorithm>
using namespace std;
int arr[101][101];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
// 친구 관계 입력
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i != j) {
arr[i][j] = 1e9; // 초기값: 큰 값
}
}
}
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
arr[a][b] = 1;
arr[b][a] = 1;
}
// 플로이드-워셜 알고리즘
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j]);
}
}
}
// 케빈 베이컨 수 계산
int minValue = 1e9;
int resultIndex = 0;
for (int i = 1; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= n; j++) {
if (arr[i][j] != 1e9) {
sum += arr[i][j];
}
}
if (sum < minValue) {
minValue = sum;
resultIndex = i;
}
}
cout << resultIndex << '\n';
return 0; // 프로그램 정상 종료
}
코드 설명
위 코드는 플로이드-워셜 알고리즘을 사용하여 모든 노드 간의 최단 거리를 계산한 뒤, 케빈 베이컨 수가 가장 작은 노드를 찾습니다.
- 그래프 초기화:
- `arr[i][j]`는 i와 j 간의 거리로, 초기값은 1e9로 설정하여 연결되지 않음을 표시합니다.
- 플로이드-워셜 알고리즘:
- 중간 노드 k를 경유하여 i에서 j로 가는 최단 거리를 갱신합니다.
- `arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j]);`
- 케빈 베이컨 수 계산:
- 각 노드에 대해 다른 모든 노드와의 거리 합을 계산합니다.
- 합이 가장 작은 노드의 번호를 결과로 저장합니다.
시간 복잡도 분석:
- 플로이드-워셜 알고리즘: O(n³).
- 케빈 베이컨 수 계산: O(n²).
전체 시간 복잡도는 O(n³)로, n ≤ 100인 경우 충분히 효율적으로 동작합니다.
결과
다음은 입력 예시와 출력 결과입니다:
입력:
5 5
1 3
1 4
4 5
4 3
3 2
출력:
3
위 입력에서 3번 사용자가 케빈 베이컨 수가 가장 작습니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 그래프' 카테고리의 다른 글
백준 2178번 [미로 탐색](C++) -yes6686- 티스토리 (0) | 2024.12.24 |
---|---|
백준 1697번 [숨바꼭질](C++) -yes6686- 티스토리 (0) | 2024.12.24 |
백준 1012번 [유기농 배추](C++) -yes6686- 티스토리 (0) | 2024.12.24 |
백준 17086번 [아기 상어 2](C++) -yes6686- 티스토리 (0) | 2024.11.23 |
백준 1189번 [컴백홈](C++) -yes6686- 티스토리 (0) | 2024.11.17 |