Pagini recente » Cod sursa (job #1888473) | Cod sursa (job #1655396) | Cod sursa (job #1839072) | Cod sursa (job #1284272) | Cod sursa (job #274026)
Cod sursa(job #274026)
{Dijkstra - drumurile de costuri min de la varful initial xp la fiecare i}
{grafuri orientate}
const nmax=170;
inf=maxint div 2;
var f,gg:text;
c:array[1..nmax,1..nmax]of integer;
s:array[1..nmax]of 0..1;
m:longint;
n,i,j,x,y,xp,k:word;
z:0..1000;
arc:0..250000;
d:array[1..nmax]of integer;
g:boolean;
procedure min(var k:word);
var m,i:integer;
begin
m:=inf*2;
for i:=1 to n do
if (s[i]=0) and (d[i]<m) then
begin
m:=d[i];
k:=i;
end
end;
{procedure drum(i:integer);
begin
if i<>0 then begin
drum(prec[i]);
write(gg,i,' ');
end
else writeln
end;}
begin
assign(f,'c.in');reset(f);
assign(gg,'c.out');rewrite(gg);
readln(f,n,arc);
for i:=1 to n do
for j:=1 to n do c[i,j]:=inf;
for i:=1 to n do c[i,i]:=0;
for i:=1 to arc do
begin
readln(f,x,y,z);
c[x,y]:=z;
end;
readln(f,xp);
for i:=1 to n do begin
d[i]:=c[xp,i];
s[i]:=0;
{if c[xp,i]<inf then prec[i]:=xp
else prec[i]:=0;}
end;
s[xp]:=1;
{prec[xp]:=0;}
g:=true;
x:=0;
repeat
min(k);
x:=x+1;
if (d[k]=inf) or (x=n) then g:=false
else
begin
s[k]:=1;
for j:=1 to n do
if (s[j]=0) and (d[j]>d[k]+c[k,j]) then begin
d[j]:=d[k]+c[k,j];
{prec[j]:=k;}
end;
end;
until not g;
for i:=1 to n do
if i<>xp then
if d[i]=inf then begin
write(gg,0{'Nu exista drum de la ',xp,' la ',i});
{writeln(g);}
end
else begin
write(gg,d[i],' '{'Drum minim de la ',xp,' la ',i});
{drum(i);
writeln(gg);}
end;
close(gg);
end.