print "Zadaj N: "; $N = readline.to_i # pole obsahujuce N prazdnych poli $susedia = Array.new($N).map{ [] } $cas_hovoru = Array.new($N) $cas_deti = Array.new($N) # docasne pole na casy... neviem ich spracovat rozumne kym nespravim strom # je to pole obsahujuce N prazdnych poli $cas_in = Array.new($N).map{ [] } ($N-1).times do print "Zadaj a b c: "; r = readline.split(" ") a = r[0].to_i-1; b = r[1].to_i-1; c = r[2].to_i $susedia[a] << b $susedia[b] << a $cas_in[a][b] = $cas_in[b][a] = c end # spravim z toho celeho strom, a pritom z cas_in spravim cas_hovoru def nastav_rodica(node, rodic) $susedia[node].delete(rodic) $cas_hovoru[node] = $cas_in[node][rodic] if node and rodic $susedia[node].each { |subnode| nastav_rodica(subnode, node) } end nastav_rodica(0, nil) # node 0 je koren grafu # odteraz uz $susedia nie su susedia ale deti def zisti_cas_deti(node) deti = $susedia[node] return 0 if deti.empty? deti.each{ |subnode| $cas_deti[subnode] = zisti_cas_deti(subnode) } # zosortujem tie deti podla toho, aky maju cas_deti # pozn.: sort_by interne pouziva standardnu C funkciu qsort, # ktora je na vacsine implementacii standardny quicksort # (vid minule vzoraky) zosortene = (0...deti.length).to_a.sort_by{ |di| $cas_deti[deti[di]] } result = 0 zosortene.each do |di| subnode = deti[di] result = $cas_deti[subnode] if $cas_deti[subnode] > result result += $cas_hovoru[subnode] end return result end puts(zisti_cas_deti(0))