type PLinearniSeznam = ^TLinearniSeznam; TLinearniSeznam = record CilovyPocitac:integer; Dalsi:PLinearniSeznam; end; {seznam počítačů, které jsou k tomuto připojeny} var V,E:integer; Navstiven:array of boolean; SeznamPripojeni:array of PLinearniSeznam; procedure PridejSpoj(Odkud,Kam:integer); {přidá jednosměrné spojení dvou počítačů} var NovySpoj:PLinearniSeznam; begin new(NovySpoj); NovySpoj^.CilovyPocitac:=Kam; NovySpoj^.Dalsi:=SeznamPripojeni[Odkud]; SeznamPripojeni[Odkud]:=NovySpoj; end; procedure NactiVstup; {viz název} var index:integer; Zacatek,Konec:integer; begin readln(V,E); SetLength(Navstiven,V+1); {alokuje o 1 prvek víc, abychom se nemuseli trápit indexováním od nuly} for index:=1 to V-1 do Navstiven[index]:=false; SetLength(SeznamPripojeni,V+1); for index:=1 to V-1 do SeznamPripojeni[index]:=nil; {počet počítačů a spojnic načten, proměnné inicializovány} for index:=1 to E do begin readln(Zacatek,Konec); PridejSpoj(Zacatek,Konec); PridejSpoj(Konec,Zacatek); {spoj je obousměrný} end; end; procedure ProhledejDoHloubky(SoucasnyPocitac:integer); var AktualniSpoj:PLinearniSeznam; begin Navstiven[SoucasnyPocitac]:=true; {už jsme tu byli} AktualniSpoj:=SeznamPripojeni[SoucasnyPocitac]; while AktualniSpoj<>nil do begin {projdeme všechny počítače připojené k tomuhle a rekurzivně je odpojíme} if not Navstiven[AktualniSpoj^.CilovyPocitac] then ProhledejDoHloubky(AktualniSpoj^.CilovyPocitac); AktualniSpoj:=AktualniSpoj^.Dalsi; end; write(SoucasnyPocitac,' '); end; begin NactiVstup; ProhledejDoHloubky(1); writeln; end.