結果
| 問題 | No.1473 おでぶなおばけさん |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-10-31 09:36:27 |
| 言語 | Ruby (3.4.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,279 bytes |
| 記録 | |
| コンパイル時間 | 995 ms |
| コンパイル使用メモリ | 7,424 KB |
| 実行使用メモリ | 51,620 KB |
| 最終ジャッジ日時 | 2024-10-08 10:39:03 |
| 合計ジャッジ時間 | 5,161 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | TLE * 1 -- * 46 |
コンパイルメッセージ
Syntax OK
ソースコード
class PriorityQueue
def initialize(array = [])
@data = []
array.each{|a| push(a)}
end
def push(element)
@data.push(element)
bottom_up
end
def pop
if size == 0
return nil
elsif size == 1
return @data.pop
else
min = @data[0]
@data[0] = @data.pop
top_down
return min
end
end
def size
@data.size
end
private
def swap(i, j)
@data[i], @data[j] = @data[j], @data[i]
end
def parent_idx(target_idx)
(target_idx - (target_idx.even? ? 2 : 1)) / 2
end
def bottom_up
target_idx = size - 1
return if target_idx == 0
parent_idx = parent_idx(target_idx)
while (@data[parent_idx][1] > @data[target_idx][1])
swap(parent_idx, target_idx)
target_idx = parent_idx
break if target_idx == 0
parent_idx = parent_idx(target_idx)
end
end
def top_down
target_idx = 0
# child がある場合
while (has_child?(target_idx))
a = left_child_idx(target_idx)
b = right_child_idx(target_idx)
if @data[b].nil?
c = a
else
c = @data[a][1] <= @data[b][1] ? a : b
end
if @data[target_idx][1] > @data[c][1]
swap(target_idx, c)
target_idx = c
else
return
end
end
end
# @param Integer
# @return Integer
def left_child_idx(idx)
(idx * 2) + 1
end
# @param Integer
# @return Integer
def right_child_idx(idx)
(idx * 2) + 2
end
# @param Integer
# @return Boolent
def has_child?(idx)
((idx * 2) + 1) < @data.size
end
end
n, m = gets.split(" ").map{|s| s.to_i}
w = Array.new(n) {Array.new(2, -Float::INFINITY)}
0.upto(n-1) {|i|
w[i][1] = Float::INFINITY
}
w[0][0] = Float::INFINITY
v = Array.new(n) {Array.new}
m.times {
s, t, d = gets.split(" ").map{|s| s.to_i}
v[s-1] << [t-1, d]
v[t-1] << [s-1, d]
}
que = PriorityQueue.new
que.push([0, Float::INFINITY, 0])
v[0].sort_by!{|x| -x[1]}
while que.size > 0 do
cv, cd, ci = que.pop
v[cv].sort_by!{|x| -x[1]} if w[cv][0] < 0
v[cv].each {|nv, nd|
nd = cd if cd < nd
if nd > w[nv][0] or (nd == w[nv][0] and ci+1 < w[nv][1]) then
w[nv] = [nd, ci+1]
break if nv == n-1
que.push([nv, nd, ci+1])
end
}
end
puts "#{w[n-1][0]} #{w[n-1][1]}"