提出 #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
結果
AC × 3
AC × 47
セット名 テストケース
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