function [laenge,weg]=kuerzesterweg(anfang,ende,entfernung,babnr,name) k=size(entfernung,1); A_0=zeros(1,k); %Indexvektor der Knoten, A_0(anfang)=1; %Der Minimalabstand zum Anfang ist bekannt (=0) B=zeros(1,k); %Indexvektor der Knoten, Erste=zeros(k); %Indexmatrix der Kanten Zweite=zeros(k); %%Indexmatrix der Kanten A_1=anfang; %Knoten in A_0, von dem aus weitergesucht wird. M=Inf*ones(1,k); %gibt die Minimalabstände an L(anfang)=0; B_0=0; %B_0 gibt später an, ob B leer ist, oder nicht. while A_0(ende)~=1 S=find(entfernung(A_1,:)< Inf); %alle Kanten, die mit A_1 beginnen for i=1:length(S) %für Lange alle Kanten in S: if B(S(i))==1 if L(A_1)+entfernung(A_1,S(i))<L(S(i)) L(S(i))=L(A_1)+entfernung(A_1,S(i)); % Minimalabstand m=1; while zwiete(m,S(i))~=1 m=m+1; end % m ist so gewählt, dass (m,S(i)) in zweite liegt zweite(m,S(i))=0; %Entferne die Kante (m,S(i)) aus zweite zweite(A_1,S(i))=1; %(A_1,S(i)) ist jetzt zweite end else if B(S(i))==0 & A_0(S(i))==0 B(S(i))=1; L(S(i))=L(A_0)+entfernung(A_1,S(i)); Zweite (A_1,S(i))=1; end end if B==0 B_0=1; %B ist leer break else S=find(B==1); [a b]=min(L(S)); %L(S(b)) ist minimal für alle i mit B(S(i))=1 u=S(b); % L(u) minimal über alle elemente von B b=1; while zweite(b,u)~=1 b=b+1; % b ist jetzt der Knoten, end erste(b,u)=1; zwiete(b,u)=0; %(k,u) wurde von zweite nach erste bewegt A_0(u)=1; B(u)=0; %u wurde von B nach A_0 bewegt A_1=u; % end end if B_0==1 %heisst: Erreichbarkeit ist nicht gegeben weg=[]; laenge=Inf; disp([' kein Weg von ' name(anfang,:)]); disp(['nach ' name(ende,:)]); else weg=zeros(1,k); weg(k)=ende; % Aufbau des kürzesten Wegs von 'anfang' nach 'ende' n=k; while weg(n)~=anfang w=find(erste(:,weg(n))==1); %Suche nach der Kante in erste, weg(n-1)=w(1); weg(k-1) n=n-1; end weg=weg(n:k); %Schneide den überflüssigen Anfangsstück ab. Resultat %ist: weg(1)=anfang laenge=M(ende); %hier ist A_1=ende, somit ist L(A_1) der gesuchte Abstand disp(['Von ' name(weg(1),:)]); for i=1:length(weg)-1; disp([' auf der Autobahn A_0 ' int2str(babnr(weg(i), weg(i+1))) ' ' name(weg(i+1),:)]); end end bis