문제 링크: https://www.acmicpc.net/problem/1389
플로이드 알고리즘을 쓰거나, 다익스트라 알고리즘을 n번 돌리면 됩니다
n<=100으로 작기 때문에 가능합니다.
플로이드 알고리즘을 돌린 다음 그래프를 찍어보면 이렇게 나옵니다. 각 행마다 저 값을 다 더하면 케빈 베이컨 수가 됩니다. 케빈 베이컨 수가 가장 작으면서 그 중 인덱스가 가장 작은 사람 출력하면 끝입니다.
#include <bits/stdc++.h>
using namespace std;
const int INF = 987654321;
int adj[100][100];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int n, m;
cin >> n >> m;
while (m--) {
int from, to;
cin >> from >> to;
--from, --to;
adj[from][to] = 1;
adj[to][from] = 1;
}
// floyd
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
if (i != j && !adj[i][j])
adj[i][j] = INF;
for (int k = 0; k < n; ++k)
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j]);
int min_bacon = 1e9;
int min_index = -1;
for (int i = 0; i < n; ++i) {
int bacon = 0;
for (int j = 0; j < n; ++j) {
if (i == j) continue;
bacon += adj[i][j];
}
if (min_bacon > bacon) {
min_bacon = bacon;
min_index = i;
}
}
cout << min_index + 1 << '\n';
return 0;
}
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 17281: ⚾ (0) | 2020.07.07 |
---|---|
[백준][C++] 7785: 회사에 있는 사람 (0) | 2020.07.06 |
[백준][C++] 10814: 나이순 정렬 (0) | 2020.07.06 |
[백준][C++] 3107: IPv6 (0) | 2020.07.06 |
[백준][C++] 2671: 잠수함식별 (0) | 2020.07.05 |