알고리즘

소스코드 - Kotlin

// 트리의 depth 구하기
fun dfs(curr: Int, d: Int) {
    depth[curr] = d
    for (next in graph[curr]) {
        if (depth[next] == 0) {
            parent[next] = curr
            dfs(next, d + 1)
        }
    }
}

// 최소 공통 조상 찾기
fun lca(a: Int, b: Int): Int {
    var aa = a
    var bb = b
		// 깊이 조정
    while (depth[aa] != depth[bb]) {
        if (depth[aa] > depth[bb]) aa = parent[aa]
        else bb = parent[bb]
    }
		// 노드가 같아지도록
    while (aa != bb) {
        aa = parent[aa]
        bb = parent[bb]
    }

    return aa
}

범위 및 함수 사용시 유의사항

시간 복잡도