(BOJ1389 케빈 베이컨의 6단계 법칙
문제 설명
- 플로이드 와샬 등을 활용하여 모든 점사이 가중치를 구하고, 그 중 최소를 출력해야한다.
- BFS 등으로도 구할 수 있지만, 플로이드 와샬로 해결했다.
문제 풀이
friends = [[0] * N for _ in range(N)]
for _ in range(M):
a, b = MIIS()
friends[a - 1][b - 1] = 1
friends[b - 1][a - 1] = 1
- 친구 관계 행렬 구성
- 기본적으로 관계가 없으면 0, 아니면 몇 번 건너 가면 만날 수 있는지 기록
for k in range(N):
for i in range(N):
for j in range(N):
if i == j:
continue
if not friends[i][k] or not friends[k][j]:
continue
t = friends[i][k] + friends[k][j]
if friends[i][j] and friends[i][j] <= t:
continue
friends[i][j] = t
friends[j][i] = t
- 거쳐가는 점, 시작 점, 도착점을 순서대로 순회
- 시작점 == 도착점이면 넘어가고,
- 둘러가는 경우가 새롭게 친구가 생기거나 더 가까운 경우라면 갱신
ans = [(sum(friends[i]), i + 1) for i in range(N)]
ans.sort()
print(ans[0][1])
- 출력을 위해 list confrehension을 활용했고,