1389번: 케빈 베이컨의 6단계 법칙
문제 풀이 아이디어
- 어떤 유저에서 다른 유저까지 가는 단계 = 어떤 유저에서 다른 유저까지 가는 최단거리
- 최단 거리 문제는 bfs를 활용해서 풉니다.
- 각각의 유저마다 다른 모든 유저까지의 최단거리를 bfs로 구해서 다 더하면 됩니다.
코드
struct Queue<T> {
var queue = [T]()
var index = 0
var isEmpty: Bool {
return queue.count - index == 0
}
mutating func push(_ e: T) {
queue.append(e)
}
mutating func pop() -> T {
defer {
index += 1
}
return queue[index]
}
}
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let N = input[0], M = input[1]
var matrix = Array(repeating: Array(repeating: false, count: N + 1), count: N + 1)
for _ in 0..<M {
let edge = readLine()!.split(separator: " ").map { Int(String($0))! }
matrix[edge[0]][edge[1]] = true
matrix[edge[1]][edge[0]] = true
}
func bfs(n: Int) -> Int {
var queue = Queue<(Int, Int)>()
var visited = Array(repeating: false, count: N + 1)
var cnt = 0
queue.push((n, 0))
visited[n] = true
while !queue.isEmpty {
let now = queue.pop()
cnt += now.1
for i in 1..<(N+1) {
if matrix[now.0][i] && !visited[i] {
queue.push((i, now.1 + 1))
visited[i] = true
}
}
}
return cnt
}
var result = Array(repeating: Int.max, count: N + 1)
for i in 1..<(N+1) {
result[i] = bfs(n: i)
}
print(result.firstIndex(of: result.min()!)!)