結果
| 問題 |
No.556 仁義なきサルたち
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-10-31 18:47:29 |
| 言語 | Ruby (3.4.1) |
| 結果 |
AC
|
| 実行時間 | 116 ms / 2,000 ms |
| コード長 | 1,361 bytes |
| コンパイル時間 | 55 ms |
| コンパイル使用メモリ | 7,424 KB |
| 実行使用メモリ | 12,544 KB |
| 最終ジャッジ日時 | 2024-11-22 11:09:56 |
| 合計ジャッジ時間 | 3,117 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 |
コンパイルメッセージ
Syntax OK
ソースコード
# https://www.leighhalliday.com/weighted-quick-union-find-algorithm-in-ruby
class UnionFind
attr_accessor :nodes, :sizes
def initialize(num)
self.nodes = []
self.sizes = []
num.times do |n|
self.nodes[n] = n
self.sizes[n] = 1
end
end
def root(i)
# Loop up the chain until reaching root
while nodes[i] != i do
# path compression for future lookups
nodes[i] = nodes[nodes[i]]
i = nodes[i]
end
i
end
def union(i, j)
rooti = root i
rootj = root j
# already connected
return if rooti == rootj
# root smaller to root of larger
if sizes[i] < sizes[j]
nodes[rooti] = rootj
sizes[rootj] += sizes[rooti]
else
nodes[rootj] = rooti
sizes[rooti] += sizes[rootj]
end
end
def connected?(i, j)
root(i) == root(j)
end
end
class Mafia < UnionFind
def fight(i, j)
rooti = root i
rootj = root j
return if rooti == rootj
if sizes[rooti] < sizes[rootj] || sizes[rooti] == sizes[rootj] && rooti > rootj
nodes[rooti] = rootj
sizes[rootj] += sizes[rooti]
else
nodes[rootj] = rooti
sizes[rooti] += sizes[rootj]
end
end
end
N, M = gets.split.map &:to_i
apes = Mafia.new(N+1)
$<.each{|s|
a, b = s.split.map &:to_i
apes.fight(a, b)
}
puts apes.nodes[1..-1].map{|i|
apes.root i
}