[백준] 1647번: 도시 분할 계획 - Kotlin[코틀린]

2024. 3. 13. 20:19·알고리즘/Baekjoon

문제

 

 

1647번: 도시 분할 계획

첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번

www.acmicpc.net

 


풀이

 

 이 문제는 MST(최소 스패닝 트리)를 구하는 것로 이번에는 크루스칼 알고리즘을 사용해서 풀이했다.

 

 우선순위 큐를 활용하여 비용이 낮은 순서대로 길을 선택하여 MST를 만들고 사이클이 발생하는 간선은 제외해준다. MST를 만드는 과정에서 발생하는 비용들은 더해준다.

 

 MST에서 간선을 하나 지우는 것으로 마을을 두 개로 나눌 수 있다. 우선 순위 큐를 이용해 MST를 구했기 때문에 가장 마지막에 연결된 간선을 지워주면 된다.

 


코드

 

import java.util.PriorityQueue

data class Edge(val start: Int, val end: Int, val cost: Int): Comparable<Edge> {
    override fun compareTo(other: Edge) = cost - other.cost
}

fun main() {
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()

    val (house, road) = br.readLine().split(' ').map { it.toInt() }
    val queue = PriorityQueue<Edge>()
    repeat(road) {
        val (start, end, cost) = br.readLine().split(' ').map { it.toInt() }
        queue.add(Edge(start, end, cost))
    }

    val parent = IntArray(house+1){ it }
    fun find(a: Int): Int {
        return if(parent[a] == a) a
        else {
            parent[a] = find(parent[a])
            parent[a]
        }
    }
    fun union(a: Int, b: Int): Boolean {
        val x = find(a)
        val y = find(b)
        return if(x == y) false
        else {
            if(x < y) parent[y] = x
            else parent[x] = y
            true
        }
    }

    var sum = 0
    var max = 0
    while (queue.isNotEmpty()) {
        val next = queue.poll()
        if(union(next.start, next.end)) { // 사이클이 발생하는 간선은 제외
            sum += next.cost
            max = next.cost
        }
    }

    bw.write("${sum - max}")
    bw.flush()
    bw.close()
    br.close()
}

 

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

[백준] 11501번: 주식 - Kotlin[코틀린]  (0) 2024.03.20
[백준] 13301번: 타일 장식물 - Kotlin[코틀린]  (0) 2024.03.17
[백준] 14719번: 빗물 - Kotlin[코틀린]  (0) 2024.03.12
[백준] 11444번: 피보나치 수 6 - Kotlin[코틀린]  (0) 2024.03.10
[백준] 2961번: 도영이가 만든 맛있는 음식 - Kotlin[코틀린]  (1) 2024.03.07
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 11501번: 주식 - Kotlin[코틀린]
  • [백준] 13301번: 타일 장식물 - Kotlin[코틀린]
  • [백준] 14719번: 빗물 - Kotlin[코틀린]
  • [백준] 11444번: 피보나치 수 6 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      에라토스테네스의 체
      프림
      dfs
      큐
      분리집합
      스택
      분할 정복
      우선순위 큐
      그래프이론
      그래프 탐색
      피보나치
      DP
      재귀
      백트래킹
      BFS
      수학
      투 포인터
      문자열
      티스토리
      모듈러 곱셈 역원
      MST
      크루스칼
      유니온파인드
      소수 판정
      누적 합
      브루트포스
      정렬
      이분 탐색
      구현
      그리디
    • hELLO· Designed By정상우.v4.10.2
    junghoooooon
    [백준] 1647번: 도시 분할 계획 - Kotlin[코틀린]
    상단으로

    티스토리툴바