[白俊]1657号タイムマシン
白俊-11657タイムマシン
質問する
N都市があります.もう一つの都市から別の都市へ行くバスはM台あります.バスごとにA、B、Cで表すことができます.Aは起点都市で、Bは到着都市で、Cはバスで移動するのに必要な時間です.時間Cが正数でない場合がある.C=0は瞬間移動を表し、C<0は時間がタイムマシンに戻ることを表す.
1番都市から出発して、1つのプログラムを編制して、残りの都市の最も速い時間を求めます.
方法
これは都市ごとに最も速い時間の問題なので、ダエストラとベルマンフォードが考えられます.
幹線に負の値が存在するため,ベルマンフォードを用いて解いた.
少なくともN−1に幹線N−1本があるため、ベルマンフォードは頂点をN回繰り返した.したがって,N回目に値を更新すると負数ループが発生したといえるため,N回繰り返す.
コード#コード#
質問する
N都市があります.もう一つの都市から別の都市へ行くバスはM台あります.バスごとにA、B、Cで表すことができます.Aは起点都市で、Bは到着都市で、Cはバスで移動するのに必要な時間です.時間Cが正数でない場合がある.C=0は瞬間移動を表し、C<0は時間がタイムマシンに戻ることを表す.
1番都市から出発して、1つのプログラムを編制して、残りの都市の最も速い時間を求めます.
方法
これは都市ごとに最も速い時間の問題なので、ダエストラとベルマンフォードが考えられます.
幹線に負の値が存在するため,ベルマンフォードを用いて解いた.
少なくともN−1に幹線N−1本があるため、ベルマンフォードは頂点をN回繰り返した.したがって,N回目に値を更新すると負数ループが発生したといえるため,N回繰り返す.
コード#コード#
class IO11657 {
private val br = System.`in`.bufferedReader()
private val bw = System.out.bufferedWriter()
fun getNM() = br.readLine().split(" ").map { it.toInt() }
fun getRow() = br.readLine().split(" ").map { it. toInt() }
fun close() = bw.close()
fun write(message: String) = bw.write(message)
}
fun main() {
val io = IO11657()
val (N, M) = io.getNM()
val arr = Array(M) { io.getRow() }
val distance = Array(N + 1) { Long.MAX_VALUE }
var flag = false
distance[1] = 0
for (i in 1..N) {
for (j in 0 until M) {
val (curNode, nextNode, cost) = arr[j]
if (distance[curNode] != Long.MAX_VALUE && distance[nextNode] > distance[curNode] + cost) {
distance[nextNode] = distance[curNode] + cost
if ( i == N ) {
flag= true
}
}
}
}
if (flag) {
io.write( (-1).toString())
io.close()
} else {
for (idx in 2..N) {
if (distance[idx] == Long.MAX_VALUE) {
io.write("-1\n")
} else {
io.write("${distance[idx]}\n")
}
}
io.close()
}
}
Reference
この問題について([白俊]1657号タイムマシン), 我々は、より多くの情報をここで見つけました https://velog.io/@greenddoovie/백준-11657번-타임머신テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol