AtCoder Beginner Contest 002

Submission #1271432

Source codeソースコード

class Graph
  
  attr_reader :vertices
  attr_reader :edges
    
  def initialize(vset, eset)
    @vertices = vset
    @edges = eset
    @graph = build_graph(vertices, edges)
  end
  
  def inspect
    "<Graph: n = #{vertices.size}, m = #{edges.size} #{vertices.inspect}>"
  end
 
  def empty?
    vertices.empty?
  end
  
  def degree(v)
    @graph[v].size
  end
 
  def super_clique_vertices(e)
    u,v = E[e]
    @graph[u] & @graph[v]
  end
  
  def count_cliques(e)
    super_clique_vertices(e).size + 2
  end
  
  def induced_subgraph(vset, w_limit = 0)
    use = {}
    vset.each{|v| use[v] = true }
    eset = edges.select{|e| E[e].all?{|v| use[v]} }
    Graph.new(vset, eset)
  end
 
  def build_graph(vset, eset)
    hash = {}
    vset.each {|v| hash[v] = [] }
    eset.each do |e| 
      u,v = E[e]
      hash[v] << u
      hash[u] << v
    end
    hash
  end
 
  def compact!(c, w_limit = 0)
    loop do
      esize = edges.size
      
      vset = vertices.select {|v| degree(v) >= c - 1 }
      use = {}
      vset.each {|v| use[v] = true }
      eset = edges.select{|e| E[e].all?{|v| use[v]} }
 
      @vertices = vset
      @edges = eset
      @graph = build_graph(vset, eset)
      
      break if esize - edges.size == 0
    end
    self
  end
 
  def delete_edge(e)
    u,v = E[e]
    @graph[v].delete(u)
    @graph[u].delete(v)
  end
 
  def max_clique
    
    highest_clique_size = E.size > 0 ? W[edges.first] + 1 : 1
    max_clique = []
 
    # Probably Dinkelback algorithm. 
    (1 .. highest_clique_size).find do |c|
      next if max_clique.size >= c
      clique = contain_clique?(c) # After evaluation, it can restart edge which found this clique.
      if clique
        # puts "#{"%3d" % c} #{clique.sort.map{|v| "%3d" % v }.join(' ')}"
        max_clique = clique 
      end
      !clique
    end
    max_clique
  end
  
  def contain_clique?(c, w_limit = c)
 
    return [] if c <= 0
 
    return vertices.size > 0 ? [vertices.first] : false if c == 1
 
    return edges.size > 0 ? E[edges.first] : false if c == 2
 
    return false if c > vertices.size
 
    return false if c * (c - 1) > edges.size * 2
 
    compact!(c, w_limit)
    
    vsize = vertices.size
    a = vertices.select{|v| degree(v) == vsize - 1}
 
    return a if a.size >= c
      
    if a.size > 0
      g = induced_subgraph(vertices - a, w_limit)
      clique = g.contain_clique?(c - a.size, w_limit)
 
      return a + clique if clique
 
    else
      esize_limit = c * (c - 1) / 2
      until edges.empty?
        break if edges.size < esize_limit || W[edges[esize_limit - 1]] < w_limit
        e = edges.shift
        vset_e = super_clique_vertices(e)
        
        break if W[e] < c
        
        if vset_e.size >= c - 2
 
          subgraph = induced_subgraph(vset_e, w_limit)
          clique = subgraph.contain_clique?(c - 2, w_limit)
 
          if clique
            edges.unshift(e) # push front last edge for max_clique restart at this e.
            return clique + E[e] 
          end
          
        end
 
        delete_edge(e)
 
        if E[e].any?{|v| degree(v) < c - 1 }
          compact!(c)
        end
        
      end
    end
    return false
  end
end
 
 
n, m = gets.split.map(&:to_i)
V = (1 .. n).to_a
E = m.times.map { gets.split.map(&:to_i).sort.freeze }.freeze
G = Graph.new(V, m.times.to_a)
 
W = Array.new(m, n)
E.each_index {|e|  W[e] = G.count_cliques(e) }
 
G.edges.sort_by!{|e|  -W[e] }
 
puts G.max_clique.size

Submission

Task問題 D - 派閥
User nameユーザ名 tinsep19
Created time投稿日時
Language言語 Ruby (2.3.3)
Status状態 AC
Score得点 100
Source lengthソースコード長 3625 Byte
File nameファイル名
Exec time実行時間 10 ms
Memory usageメモリ使用量 1916 KB

Test case

Set

Set name Score得点 / Max score Cases
all 100 / 100 00_sample_01.txt,00_sample_02.txt,00_sample_03.txt,00_sample_04.txt,test_01.txt,test_02.txt,test_03.txt,test_04.txt,test_05.txt,test_06.txt,test_07.txt,test_08.txt,test_09.txt,test_10.txt,test_11.txt,test_12.txt,test_13.txt,test_14.txt,test_15.txt,test_16.txt,test_17.txt,test_18.txt,test_19.txt,test_20.txt,test_21.txt,test_22.txt,test_23.txt,test_24.txt,test_25.txt,test_26.txt,test_27.txt,test_28.txt,test_29.txt,test_30.txt,test_31.txt,test_32.txt,test_33.txt,test_34.txt,test_35.txt,test_36.txt,test_37.txt,test_38.txt,test_39.txt,test_40.txt,test_41.txt,test_42.txt,test_43.txt,test_44.txt,test_45.txt,test_46.txt,test_47.txt,test_48.txt,test_49.txt,test_50.txt,test_51.txt,test_52.txt,test_53.txt,test_54.txt,test_55.txt,test_56.txt,test_57.txt,test_58.txt,test_59.txt,test_60.txt,test_61.txt,test_62.txt,test_63.txt,test_64.txt,test_65.txt,test_66.txt,test_67.txt,test_68.txt,test_69.txt,test_70.txt

Test case

Case name Status状態 Exec time実行時間 Memory usageメモリ使用量
00_sample_01.txt AC 7 ms 1788 KB
00_sample_02.txt AC 7 ms 1788 KB
00_sample_03.txt AC 8 ms 1788 KB
00_sample_04.txt AC 7 ms 1788 KB
test_01.txt AC 7 ms 1788 KB
test_02.txt AC 7 ms 1788 KB
test_03.txt AC 7 ms 1788 KB
test_04.txt AC 8 ms 1788 KB
test_05.txt AC 8 ms 1788 KB
test_06.txt AC 7 ms 1788 KB
test_07.txt AC 8 ms 1788 KB
test_08.txt AC 8 ms 1916 KB
test_09.txt AC 8 ms 1788 KB
test_10.txt AC 8 ms 1916 KB
test_11.txt AC 8 ms 1788 KB
test_12.txt AC 10 ms 1916 KB
test_13.txt AC 7 ms 1788 KB
test_14.txt AC 7 ms 1788 KB
test_15.txt AC 8 ms 1916 KB
test_16.txt AC 8 ms 1916 KB
test_17.txt AC 8 ms 1916 KB
test_18.txt AC 8 ms 1788 KB
test_19.txt AC 9 ms 1916 KB
test_20.txt AC 9 ms 1912 KB
test_21.txt AC 8 ms 1788 KB
test_22.txt AC 8 ms 1916 KB
test_23.txt AC 8 ms 1916 KB
test_24.txt AC 8 ms 1788 KB
test_25.txt AC 7 ms 1788 KB
test_26.txt AC 8 ms 1916 KB
test_27.txt AC 8 ms 1916 KB
test_28.txt AC 7 ms 1788 KB
test_29.txt AC 8 ms 1916 KB
test_30.txt AC 8 ms 1916 KB
test_31.txt AC 9 ms 1916 KB
test_32.txt AC 9 ms 1916 KB
test_33.txt AC 9 ms 1916 KB
test_34.txt AC 8 ms 1788 KB
test_35.txt AC 8 ms 1916 KB
test_36.txt AC 8 ms 1916 KB
test_37.txt AC 8 ms 1788 KB
test_38.txt AC 8 ms 1916 KB
test_39.txt AC 9 ms 1916 KB
test_40.txt AC 8 ms 1788 KB
test_41.txt AC 8 ms 1916 KB
test_42.txt AC 8 ms 1916 KB
test_43.txt AC 8 ms 1788 KB
test_44.txt AC 9 ms 1916 KB
test_45.txt AC 9 ms 1916 KB
test_46.txt AC 9 ms 1916 KB
test_47.txt AC 8 ms 1916 KB
test_48.txt AC 8 ms 1916 KB
test_49.txt AC 8 ms 1916 KB
test_50.txt AC 8 ms 1916 KB
test_51.txt AC 8 ms 1916 KB
test_52.txt AC 8 ms 1916 KB
test_53.txt AC 8 ms 1916 KB
test_54.txt AC 8 ms 1916 KB
test_55.txt AC 9 ms 1916 KB
test_56.txt AC 8 ms 1916 KB
test_57.txt AC 8 ms 1916 KB
test_58.txt AC 9 ms 1916 KB
test_59.txt AC 8 ms 1916 KB
test_60.txt AC 8 ms 1912 KB
test_61.txt AC 8 ms 1912 KB
test_62.txt AC 7 ms 1788 KB
test_63.txt AC 8 ms 1916 KB
test_64.txt AC 8 ms 1916 KB
test_65.txt AC 8 ms 1916 KB
test_66.txt AC 8 ms 1916 KB
test_67.txt AC 8 ms 1916 KB
test_68.txt AC 8 ms 1916 KB
test_69.txt AC 8 ms 1916 KB
test_70.txt AC 8 ms 1916 KB