提出 #37382036
ソースコード 拡げる
# 解説の写経
RED = 1
BLUE = -1
n, m = gets.chomp.split.map(&:to_i)
$paths = Array.new(n + 1) { Array.new }
m.times do
from, to = gets.chomp.split.map(&:to_i)
$paths[from] << to
$paths[to] << from
end
$color = Array.new(n + 1)
def dfs(current_node, prev_node, current_color)
result = { RED => 0, BLUE => 0}
$color[current_node] = current_color
result[current_color] += 1
$paths[current_node].each do |next_node|
# 既に訪問済みのノードで、別の色で塗ってあれば検証不要なのでスキップ
next if next_node == prev_node || $color[next_node] == -current_color
# 隣り合うはずのノードなのに同じ色で塗られている場合は2部グラフではない
return { RED => -1, BLUE => -1 } if $color[next_node] == current_color
next_result = dfs(next_node, current_node, -current_color)
# 次のノード(以降)で2部グラフではないことが検出された
return { RED => -1, BLUE => -1 } if next_result[RED] == -1
result.merge!(next_result) {|_, current_value, next_value| current_value + next_value }
end
result
end
# ありうる頂点の全組み合わせから実在するMを減らしておく
answer = n * (n - 1) / 2 - m
1.upto(n) do |i|
# 走査済みであればスキップ
next unless $color[i].nil?
# 未走査であればこの点を起点としてグラフを走査する
result = dfs(i, -1, RED)
if result[RED] == -1
# 1つでも2部グラフではない連結成分があれば条件が成立しないので終了
puts 0
exit
end
# 同じ連結成分内の同じ色どうしの組み合わせ分を減らす
# 別の連結成分に繋ぐ分にはどう繋いでも2部グラフになる
result.each {|_, value| answer -= value * (value - 1) / 2 }
end
# 最後まで残った組み合わせが答えになる
puts answer
提出情報
| 提出日時 | |
|---|---|
| 問題 | D - Make Bipartite 2 |
| ユーザ | thatblue |
| 言語 | Ruby (2.7.1) |
| 得点 | 400 |
| コード長 | 1937 Byte |
| 結果 | AC |
| 実行時間 | 1317 ms |
| メモリ | 312144 KiB |
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 400 / 400 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | example0.txt, example1.txt, example2.txt |
| All | 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, example0.txt, example1.txt, example2.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 000.txt | AC | 60 ms | 14140 KiB |
| 001.txt | AC | 55 ms | 14220 KiB |
| 002.txt | AC | 195 ms | 49048 KiB |
| 003.txt | AC | 121 ms | 31260 KiB |
| 004.txt | AC | 423 ms | 50956 KiB |
| 005.txt | AC | 612 ms | 203860 KiB |
| 006.txt | AC | 1287 ms | 299540 KiB |
| 007.txt | AC | 1317 ms | 312144 KiB |
| 008.txt | AC | 216 ms | 18192 KiB |
| 009.txt | AC | 246 ms | 20652 KiB |
| 010.txt | AC | 242 ms | 20572 KiB |
| 011.txt | AC | 116 ms | 20460 KiB |
| 012.txt | AC | 246 ms | 42772 KiB |
| 013.txt | AC | 180 ms | 22924 KiB |
| 014.txt | AC | 252 ms | 35480 KiB |
| 015.txt | AC | 216 ms | 48968 KiB |
| 016.txt | AC | 195 ms | 49192 KiB |
| 017.txt | AC | 201 ms | 49084 KiB |
| 018.txt | AC | 195 ms | 49224 KiB |
| 019.txt | AC | 264 ms | 33312 KiB |
| 020.txt | AC | 109 ms | 15688 KiB |
| 021.txt | AC | 216 ms | 19696 KiB |
| 022.txt | AC | 116 ms | 15640 KiB |
| 023.txt | AC | 124 ms | 16016 KiB |
| 024.txt | AC | 267 ms | 49320 KiB |
| 025.txt | AC | 221 ms | 49868 KiB |
| 026.txt | AC | 196 ms | 49196 KiB |
| 027.txt | AC | 199 ms | 49152 KiB |
| 028.txt | AC | 198 ms | 49064 KiB |
| 029.txt | AC | 309 ms | 49204 KiB |
| 030.txt | AC | 292 ms | 34696 KiB |
| 031.txt | AC | 260 ms | 27244 KiB |
| 032.txt | AC | 245 ms | 21900 KiB |
| 033.txt | AC | 72 ms | 14396 KiB |
| 034.txt | AC | 358 ms | 62552 KiB |
| 035.txt | AC | 197 ms | 49232 KiB |
| 036.txt | AC | 208 ms | 47360 KiB |
| 037.txt | AC | 197 ms | 49116 KiB |
| 038.txt | AC | 197 ms | 48996 KiB |
| 039.txt | AC | 537 ms | 126024 KiB |
| 040.txt | AC | 378 ms | 76940 KiB |
| 041.txt | AC | 231 ms | 24972 KiB |
| 042.txt | AC | 252 ms | 19980 KiB |
| 043.txt | AC | 59 ms | 14144 KiB |
| example0.txt | AC | 56 ms | 14252 KiB |
| example1.txt | AC | 59 ms | 14136 KiB |
| example2.txt | AC | 55 ms | 14196 KiB |