Záverečné zadanie - vlakové spojenia
Created: 2009-10-03 - 12:59
%hrany naznacujuce prepojenia miest aj s cenami spojeni
edge(kosice,presov,35).
edge(kosice,roznava,31).
edge(kosice,trebisov,23).
edge(trebisov,michalovce,21).
edge(presov,spiskaNovaVes,39).
edge(spiskaNovaVes,poprad,15).
edge(roznava,rimavskaSobota,55).
edge(rimavskaSobota,lucenec,20).
edge(lucenec,zvolen,43).
edge(zvolen,banskaBystrica,12).
edge(banskaBystrica,ruzomberok,34).
edge(ruzomberok,liptovskyMikulas,23).
edge(liptovskyMikulas,poprad,41).
edge(ruzomberok,martin,13).
edge(martin,zilina,12).
edge(zilina,trencin,34).
edge(trencin,trnava,63).
edge(trnava,bratislava,23).
edge(trnava,nitra,14).
edge(nitra,prievidza,40).
edge(prievidza,zvolen,30).
%zistuje, ci su mesta spojene (lubovolnym smerom)
spojene(X,Y,Z):-edge(X,Y,Z);edge(Y,X,Z).
%obratenie zoznamu naruby
rv([X|Y],Z,W):-rv(Y,[X|Z],W).
rv([],X,X).
revert(X,Y):-rv(X,[],Y).
%najlepsie spojenie medzi dvoma mestami
najlepsieSpojenie(Z,Do,Cesta,Cena):-list(Z,Do,[Cena|Zvysok]),spojenie(Z,Do,Cesta,Cena).
%vypise zoznam s cenami spojenia Z-Do
list(Z,Do,Zoznam):-findall(Y,spojenie(Z,Do,Cesta,Y),Zoznam1),sort(Zoznam1,Zoznam).
%vypise vsetky spojenia medzi dvoma mestami aj s ich cenami
spojenie(Z,Do,VyslednaCesta,Cena):-cesta(Z,Do,[Z],Cesta,Cena),revert(Cesta,VyslednaCesta).
%zisti spojenie z mesta do mesta
cesta(Do,Do,Cesta,Cesta,0).
cesta(Z,Do,AktualnaCesta,Cesta,Cena):-Z\=Do,spojene(Z,Dalsie,CenaSpojenia),non_member(Dalsie,AktualnaCesta),cesta(Dalsie,Do,[Dalsie|AktualnaCesta],Cesta,CenaAktualna),Cena is CenaSpojenia+CenaAktualna.