Problem Solving/BOJ

[백준 / BOJ] C++ 1389 케빈 베이컨의 6단계 법칙

nageune 2023. 2. 25. 03:04
728x90
반응형

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

 

문제

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

 

 

풀이

플로이드-워셜 알고리즘을 사용해 각 사람이 다른 사람에 이르기까지의 단계를 각각 구해 케빈 베이컨의 수를 구하고, 최솟값을 가지는 사람의 번호를 출력하는 문제다.

 

 

코드

#include <bits/stdc++.h>
using namespace std;
#define INF 1e9

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int N, M, dist[101][101], m = 1e9, ans = 1;
  cin >> N >> M;
  // dist 배열 초기화
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= N; j++)
      dist[i][j] = i == j ? 0 : INF;
  // 간선 입력
  while (M--) {
    int a, b;
    cin >> a >> b;
    dist[a][b] = 1;
    dist[b][a] = 1;
  }
  // 플로이드 워셜
  for (int k = 1; k <= N; k++)
    for (int i = 1; i <= N; i++)
      for (int j = 1; j <= N; j++)
        dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
  // 케빈 베이컨 수
  for (int i = 1; i <= N; i++) {
    int sum = 0;
    for (int j = 1; j <= N; j++)
      sum += dist[i][j];
    if (m > sum) {
      m = sum;
      ans = i;
    }
  }
  cout << ans << '\n';
  return 0;
}
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[백준 / BOJ] C++ 1956 운동  (0) 2023.02.25
[백준 / BOJ] C++ 1613 역사  (0) 2023.02.25
[백준 / BOJ] C++ 11403 경로 찾기  (0) 2023.02.25
[백준 / BOJ] C++ 11404 플로이드  (0) 2023.02.25
[백준 / BOJ] C++ 2812 크게 만들기  (0) 2023.02.25