(* implementazione classica della visita in ampiezza: per implementare
* la coda in pascal facciamo uso di array circolari q1[] e q2[] in cui
* "qhead" e’ l’indice dell’elemento in testa alla coda, "qcount" e’ il
* numero di elementi presenti nella coda.
*)
procedure bfs(partenza : int64;arrivo:int64;var res :arrayof int64);
var qhead, qcount, first, second, i, j : int64;
begin
q1[0]:= partenza; q2[0]:=0;
qhead :=0; qcount :=1;
for i:=0to N-1do visited[i]:=False;
while qcount > 0do
begin
first := q1[qhead];
second := q2[qhead];
inc(qhead);
if qhead = QSIZE then
qhead :=0;
dec(qcount);
if(visited[first]=true)then
begin
if second<res[first]then res[first]:=second
else continue;
end;
visited[first]:=True;
res[first]:= second;
for j:=0to gsize[first]-1do
begin
q1[(qhead + qcount)mod QSIZE]:= graph[first][j];
q2[(qhead + qcount)mod QSIZE]:= second + peso[first][j];;
inc(qcount);
end;
end;
end;
begin
(*assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);*)
readln(N,M);
for h:=0to M-1doreadln(S[h],E[h],P[h]);
for h:=0to N-1do
begin
setlength(graph[h],1);(*graph è la lista di adiacenza del grafo orientato con i nodi adiacenti,*)(*peso è la lista di adiacenza con i pesi relativi agli archi considerati*)
setlength(peso[h],1);
(* all’inizio, la lista di adiacenza del nodo h ha dimensione 0
* e capacita’ 1.
*)
gsize[h]:=0;
gcapa[h]:=1;
dist[h]:=9223372036854775807;(*array delle distanze inizializzato con il massimo valore degli INT64*)
end;
for h:=0to M-1do
begin
a := S[h]; b := E[h]; c:=P[h];
(* se ho esaurito i posti nella lista di adiacenza del nodo a *)
if gsize[a]= gcapa[a]then
begin
(* allora raddoppio la sua capacita’ *)
gcapa[a]:= gcapa[a]shl1;
setlength(graph[a], gcapa[a]);
setlength(peso[a], gcapa[a]);
end;
graph[a][gsize[a]]:= b;
peso[a][gsize[a]]:= c;
inc(gsize[a]);
end;
inizio:=0;
for h:=1to N do
begin
fine:=h;
bfs(inizio,fine,dist);
end;
(* calcola le distanze partendo da inizio *)
for h:=0to N-1do
if dist[h]<>9223372036854775807thenwrite(dist[h],' ')