Program Kerik; const MaxN=100; var Hrany: array[1..MaxN] of integer; { reprezentace grafu seznamem sousedů } Vrcholy: array[1..MaxN+1] of integer; Listky: array[1..MaxN] of integer; { počet lístků v daném vrcholu } NejCesta: array[1..MaxN] of integer; { nejlepší cesta z listu do daného vrcholu } N,max_cesta, max_vrchol, max_syn1, max_syn2: integer; procedure Ohodnot(v,o:integer); { najde vrchol, kde se láme nejvýživnější cesta } var max1,max2,p_max_syn1,p_max_syn2,i: integer; begin max1:=0; max2:=0; p_max_syn1:=-1; p_max_syn2:=-1; { hledáme dva nejvýživnějsí podstromy } for i:=Vrcholy[v] to Vrcholy[v+1]-1 do { ohodnoť všechny podstromy vrcholu v } if Hrany[i]<>o then begin { nebudeme se vracet zpátky } Ohodnot(Hrany[i],v); { zjisti výživnost cesty končící v synu } if NejCesta[Hrany[i]]>=max1 then begin { našli jsme zatím nejvýživnějšího syna } max2:=max1; max1:=NejCesta[Hrany[i]]; p_max_syn2:=p_max_syn1; p_max_syn1:=Hrany[i]; end else if NejCesta[Hrany[i]]>=max2 then begin { našli jsme zatím 2. nejvýživnějšího syna } max2:=NejCesta[Hrany[i]]; p_max_syn2:=Hrany[i]; end; end; NejCesta[v] := Listky[v] + max1; { nejlepší cesta z nějakého listu končící zde má tuto hodnotu } if Listky[v] + max1 + max2 > max_cesta then begin { našli jsme lepší cestu lámající se zde } max_cesta:=Listky[v] + max1 + max2; max_vrchol:=v; max_syn1:=p_max_syn1; max_syn2:=p_max_syn2; end; end; procedure Vypis(v,o,smer:integer); var i,max,max_syn:integer; begin if smer = 1 then write(v,' '); { jdeme z vrcholu dolů, chceme prefixový výpis } max:=-1; for i:=Vrcholy[v] to Vrcholy[v+1]-1 do begin { najdeme toho nejlepšího syna } if (Hrany[i]<>o) and (NejCesta[Hrany[i]]>max) then begin max:=NejCesta[Hrany[i]]; max_syn:=Hrany[i]; end; end; if max<>-1 then Vypis(max_syn,v,smer); { pokud existuje, vypíšeme jej } if smer = -1 then write(v,' '); { jdeme zespoda nahoru, chceme postfixový výpis } end; begin { Zde se načítají data... } if N = 0 then begin writeln('Chudinka housenka, asi se moc nenažere...'); exit; end; max_syn1:=-1; max_syn2:=-1; max_cesta:=-1; Ohodnot(1,-1); { výpis cesty } if max_syn1 <> -1 then Vypis(max_syn1,max_vrchol,-1); write(max_vrchol,' '); if max_syn2 <> -1 then Vypis(max_syn2,max_vrchol,1); writeln; end.