케빈 베이컨의 여섯다리 : 위키백과_케빈 베이컨의 여섯다리
를 구현하는 문제
한 사람을 기준으로 친구 관계에 있는 사람들을 이어나가 몇 다리만에 그 사람과 연관이 있어지는지 확인 하는 문제
문제에서는 6단계의 법칙이라 했지만 검색을 하면 여섯다리로 나온다
자세한 내용은 위 링크를 참조, 또는 위 링크의 출처를 참조
DFS를 사용하면 손쉽게 결과가 구해진다.
몇가지 주의 할 점이라면 방문한 사람을 다시 방문해야 하는 경우가 존재 한다
예를들어 1 -> 2 -> 4 -> 5 의 경우 거리는 3이 되지만 동시에 1 -> 5 라면 거리를 1로 수정해야 하는 경우가 존재한다.
따라서 방문 했다고 해서 재 방문을 막으면 오답이 된다.
위 경우는 백준 문제의 예시에서도 참고 할 수 있다.
#include <iostream>
using namespace std;
bool adjMap[100][100];
int bacon[100];
int n;
void dfs(int num, int cnt, int checker[100])
{
checker[num] = cnt;
for (int i = 0; i < n; i++)
if (adjMap[num][i] && checker[i] == -1)
dfs(i, cnt + 1, checker);
else if (adjMap[num][i] && checker[i] > cnt + 1)
dfs(i, cnt + 1, checker);
}
int main()
{
int m;
int min = 100000;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
short x, y;
cin >> x >> y;
adjMap[x-1][y-1] = adjMap[y-1][x-1] = true;
}
for (int i = 0; i < n; i++)
{
int check[100];
fill_n(check, n, -1);
dfs(i, 0, check);
for (int j = 0; j < n; j++)
bacon[i] += check[j];
if (min > bacon[i])
min = bacon[i];
}
for (int i = 0; i < n; i++)
if (min == bacon[i])
{
cout << i + 1;
break;
}
}
2019-01-06 17:36:11에 Tistory에서 작성되었습니다.