Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 22. 02. 2011 23:29

hessyk
Příspěvky: 86
Reputace:   
 

hledani nejkratsi cesty floyd-w. algoritmem

ahoj, chtel sem se zeptat  na tenhle algoritmus...mohl byste mi nekdo prosim vysvetlit jak funguje? jaky se sem davaj vstupy a vystupy sou jaky?ta matice sousednosti se nacita jen ze vstupu?a ma to nejakou omezenost pro vstupy?diky moc...krome tehlech otazek bych byl moc vdecny kdyby mi tu nekdo velice podrobne napsal proc tento program takhle vypada...diky moc


program GRAFMATICE1;

const
  velikost_matice = 4;

type
  typ_matice = array[1..velikost_matice,1..velikost_matice] of integer;

var
  matice1: typ_matice;

procedure vycistiMatici(var matice:typ_matice);
var
  i, j: integer;
begin
  for i:=1 to velikost_matice do
    begin
    for j:= 1 to velikost_matice do
      begin
      matice[i,j]:= 999;
      end;
    end;
end;

procedure zadejHranu(odkud: integer; kam: integer; vzdalenost: integer; var matice:typ_matice);
begin
  matice[odkud,kam]:= vzdalenost;
  matice[kam,odkud]:= vzdalenost;
end;

procedure odeberHranu(odkud: integer; kam: integer; var matice:typ_matice);
begin
  matice[odkud,kam]:= 0;
  matice[kam,odkud]:= 0;
end;

function jeHrana(odkud: integer; kam: integer; var matice:typ_matice):boolean;
begin
  if(matice[odkud,kam] = 1) then jeHrana:=true else
                                 jeHrana:=false;
end;

function minimum(a: integer; b: integer):integer;
begin
  if(a<=b) then minimum:= a else
  minimum:= b;

end;

procedure nejkratsiCesta(var matice:typ_matice);
{ Samotne hledani nejkratsi cesty }
var
i, j, k: integer;
{pomocne promenne}
begin
  for i:=1 to velikost_matice do
    begin
    for j:=1 to velikost_matice do
      begin
      for k:=1 to velikost_matice do
        begin
        matice[i,j]:= minimum(matice[i,j], (matice[i,k] + matice[k,j]));
        end; { k }
      end; { j }
    end; { i }
end;

procedure vypisMatici(var matice:typ_matice);
var
   i,j: integer;
begin
   writeln('Matice:');
   for i:=1 to velikost_matice do
    begin
     for j:= 1 to velikost_matice do
      begin
      write(matice[i,j]);
      write(',');
      end;
     writeln;
    end;
    writeln('--->KONEC MATICE---->');
    writeln;
end;

begin
  {samotny program}
  vycistiMatici(Matice1);
  vypisMatici(Matice1);

  {zadani nekolika testovacich hran}
  zadejHranu(1,2,63,Matice1);
  zadejHranu(1,3,103,Matice1);
  zadejHranu(1,4,157,Matice1);
  zadejHranu(3,4,69,Matice1);
  zadejHranu(2,4,111,Matice1);
  zadejHranu(2,3,33,Matice1);
  { Most   ..1
    Kladno ..2
    Praha  ..3
    Kolin  ..4 }

  vypisMatici(Matice1);
  nejkratsiCesta(Matice1);
  vypisMatici(Matice1);
  readln;
end.

Offline

 

#2 22. 02. 2011 23:42

pizet
Místo: Levice/Praha
Příspěvky: 459
Reputace:   11 
 

Re: hledani nejkratsi cesty floyd-w. algoritmem

↑ hessyk: Nechce sa mi to čítať ale tieto dve stránky by mohli pomôcť. Na tej druhej nájdeš aj vizualizáciu.

http://algoritmy.net/article/5207/Floyd … algoritmus

http://www.pms.ifi.lmu.de/lehre/compgeo … ualization


Do you follow my way? Or you just see a black stain swimming in the Milky Way ...
KSP je určený pre študentov základných a stredných škôl, ktorí majú záujem naučiť sa niečo z oblasti algoritmov, logických úloh, programovania a informatiky.

Offline

 

#3 24. 02. 2011 10:15

hessyk
Příspěvky: 86
Reputace:   
 

Re: hledani nejkratsi cesty floyd-w. algoritmem

dik moc za ochotu, ale ja sem myslel jestli by se nenasel nekdo kdo by mi vystvetlil ten program po lopate jak funguje...

Offline

 

#4 25. 02. 2011 22:14

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: hledani nejkratsi cesty floyd-w. algoritmem

Nevim, jak moc umis Pascal. Zkusim to popsat, ale ne dopodrobna (zatim :-) ). Ta prvni cast (program, const, type, var) to jsou deklarace ruzne, jestli nevis, tak se zkus nekde podivat co to program, const... apod znamena (anebo to kdyztak napisu kdyz se mi bude chtit :-) ). Pak jsou tam ruzne procedury (vycistiMatici, zadejHranu atd.). Co ty procedury delaji, se da odvodit z nazvu. Hlavni cast zacina tim 'begin' s tou poznamkou {samotny program}. Tam vidis, jak jsou postupne volany procedury:

Nejdriv se vycisti ta matice a pak se vypise.

Pak se do te matice zadaji ty testovaci hrany.

Nakonec se zase ta matice vypise, najde se ta nejkratsi cesta a pak se zase vypise.

Vstupy se nijak nezadavaji, ta matice je zadana uz v programu volanim 'zadejHranu'. Snad jsem alespon castecne tve dotazy zodpovedel, kdyztak se dal ptej.

Offline

 

#5 12. 03. 2011 11:43

hessyk
Příspěvky: 86
Reputace:   
 

Re: hledani nejkratsi cesty floyd-w. algoritmem

ahoj diky moc za trpelivost a za ochotu. Porad mi to ale neni jasny...v programku se moc nevyznam...ten program teda funguje tak, ze se zada do vstupu nejaka matice...tu nevim kde vezmu...pak nechapu jak a proc se vycisti a ty testovaci hrany vezmu kde? jo a rikas ze vstupy se nijak nezadavaj ale ty se zavadaj vzdycky ne? nebo mi to teda vypise abych zadal tu hranu nebo jak to bude vypadat kdyz bych to chtel vyzkouset?
kdyz to se mnou vzdas tak to pochopim...sem totiz vazne antitalent:D

Offline

 

#6 13. 03. 2011 14:50 — Editoval hessyk (13. 03. 2011 15:38)

hessyk
Příspěvky: 86
Reputace:   
 

Re: hledani nejkratsi cesty floyd-w. algoritmem

ahoj, jeste jsem se chtel zeptat ohledne vstupu a vystupu...muzes mi dat prosim nejakej priklad? bude to vypadat tak, ze zadam nejakou matici kde budou 0 na diagonale a nekonecno nebo urcite cislo podle toho jestli je tam cesta a jaka a na vystupu dostanu  matici pres ktery vede nejkratsi cesta nebo jak?
jinak par dalsich veci..chtel bych se zeptat jak funguje a hlavne na co je vycistimatici...a pak uplne posledni cast samotny program-tam se nikde nevolaji zadne procedury ani fce ktere jsou nahore napsany tak jak ten program muze fungovat?
diky moc
ä s tim vstupem a vystupem uz jsem to pochopil...dekuju...spis bych potreboval vysvetlit ten samotny program na konci a vycistimatici vstupy a vystupy uz jsem celkem pochopil..

Offline

 

#7 13. 03. 2011 16:22 — Editoval gladiator01 (16. 03. 2011 12:04)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: hledani nejkratsi cesty floyd-w. algoritmem

↑ hessyk:
Myslíš tyto dvě procedury? Tak si je tam zadej (podobně jako je použito zadejHranu(1,2,63,Matice1);) a vyzkoušej co se stane.

Code:

procedure odeberHranu(odkud: integer; kam: integer; var matice:typ_matice);
begin
  matice[odkud,kam]:= 0;
  matice[kam,odkud]:= 0;
end;

function jeHrana(odkud: integer; kam: integer; var matice:typ_matice):boolean;
begin
  if(matice[odkud,kam] = 1) then jeHrana:=true else
                                 jeHrana:=false;
end;

Ostatní procedury zavolané jsou.

Procedura vycistimatici ti v podstatě inicializuje buňky pole (matice[i,j])- uloží do nich 999 - to ti zaručí, že v každém políčku bude nějaká hodnota.
Výslednou matici by ti mělo vypsat poslední volání procedury vypisMatici(Matice1);

Proč si to prostě nevyzkoušíš spustit?


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson