题目大意:
给出N个点,M条边,以及目标点T,求点1到T的最短路是多少。
30%:n<=10 m<=20
60%: n<=1000 m<=20000
100%: n<=5000000 m<=10000000
题解:
这题就是裸的spfa,没什么好说了,注意几点;
①无向边,建边要双向
②邻接表查询
③数组注意大小
④spfa
时间复杂度:O(N+M)
var
next,s,t,w:array [0..10000001] of longint;
list,dis:array [0..5000001] of longint;
q:array [0..20000001] of longint;
v:array [0..5000001] of boolean;
i,j,n,m,k,x,y,z:longint;
procedure add(p1,p2,p3,p4:longint);
begin
s[p4]:=p1;
t[p4]:=p2;
w[p4]:=p3;
next[p4]:=list[p1];
list[p1]:=p4;
end;
procedure spfa;
var
i,head,tail:longint;
begin
for i:=1 to n do
dis[i]:=maxlongint;
v[1]:=true;
dis[1]:=0;
q[1]:=1;
head:=0;
tail:=1;
while head<tail do
begin
inc(head);
i:=list[q[head]];
while i>0 do
begin
if dis[s[i]]+w[i]<dis[t[i]] then
begin
dis[t[i]]:=dis[s[i]]+w[i];
if not(v[t[i]]) then
begin
v[t[i]]:=true;
inc(tail);
q[tail]:=t[i];
end;
end;
i:=next[i];
end;
v[q[head]]:=false;
end;
end;
begin
readln(n,m,k);
j:=0;
for i:=1 to m do
begin
readln(x,y,z);
inc(j);
add(x,y,z,j);
inc(j);
add(y,x,z,j);
end;
spfa;
writeln(dis[k]);
end.