Submission #1271432
Source Code Expand
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 Info
Submission Time | |
---|---|
Task | D - 派閥 |
User | tinsep19 |
Language | Ruby (2.3.3) |
Score | 100 |
Code Size | 3625 Byte |
Status | AC |
Exec Time | 10 ms |
Memory | 1916 KB |
Judge Result
Set Name | all | ||
---|---|---|---|
Score / Max Score | 100 / 100 | ||
Status |
|
Set Name | Test Cases |
---|---|
all | 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 |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
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 |