PS(Problem Solving)/BOJ

[백준/BOJ] 1753번: 최단경로

JunsuKim 2022. 8. 3.
728x90

문제

https://www.acmicpc.net/problem/1753

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가

www.acmicpc.net

해설

다익스트라 알고리즘을 사용하여 해결할 수 있는 문제이다.

문제에서 방향그래프가 주어진다고 되어있다. 따라서 단방향으로만 그래프를 설정해주면 된다.

다익스트라 알고리즘을 잘 모른다면 다익스트라 알고리즘 글을 읽어보면 이 문제를 쉽게 풀 수 있을 것이다.

소스 코드

import java.util.*
import kotlin.collections.ArrayList

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

fun main() = with(System.`in`.bufferedReader()) {
    val (nodeCnt, edgeCnt) = readLine().split(" ").map { it.toInt() }
    val startNode = readLine().toInt()

    val graph = Array(nodeCnt + 1) { ArrayList<Pair<Int, Int>>() }
    repeat(edgeCnt) {
        val (from, to, cost) = readLine().split(" ").map { it.toInt() }
        graph[from].add(Pair(to, cost))
    }

    val cost = dijkstra(startNode, nodeCnt, graph)

    repeat(nodeCnt) { i ->
        if(cost[i+1] == Int.MAX_VALUE) println("INF")
        else println(cost[i+1])
    }
}

private fun dijkstra(start: Int, n: Int, graph: Array<ArrayList<Pair<Int, Int>>>): IntArray {
    val pq = PriorityQueue<EdgeInfo>()
    pq.add(EdgeInfo(start, 0))

    val cost = IntArray(n + 1) { Int.MAX_VALUE }
    cost[start] = 0

    while(pq.isNotEmpty()) {
        val cur = pq.poll()
        val curNode = cur.node
        val curCost = cur.cost

        for(i in graph[curNode].indices) {
            val nextNode = graph[curNode][i].first
            val nextCost = curCost + graph[curNode][i].second

            if(nextCost < cost[nextNode]) {
                cost[nextNode] = nextCost
                pq.add(EdgeInfo(nextNode, nextCost))
            }
        }
    }

    return cost
}
728x90

댓글