思路很简单,显然是spfa求最短路
但需要注意
1.用指针#chocolate giving [usaco2010 Feb]储存信息,不要用数组,会炸空间。
2.队列q长度要开大些,2*n+10较为合适。
3.好吧,是道水题,贴代码…
type pp=^node;
node=record
dot,v:longint;
next:pp;
end;
const maxn=50006;
var dis:array[0..maxn]of longint;
q:array[0..2*maxn+20]of longint;
a:array[0..maxn]of pp;
f:array[0..maxn]of boolean;
n,m,b,head,tail,u,v,x,y,i,j,l,w:longint;
p:pp;
begin
{assign(input,'cgiving.in');assign(output,'cgiving.out');
reset(input);rewrite(output);}
readln(n,m,b);
for i:=1 to n do
begin
new(a[i]);
a[i]^.next:=nil;
end;
for i:=1 to n do dis[i]:=maxlongint div 3;
for i:=1 to m do
begin
readln(x,y,l);
new(p);p^.next:=a[x]^.next;
p^.dot:=y;p^.v:=l;a[x]^.next:=p;
new(p);p^.next:=a[y]^.next;
p^.dot:=x;p^.v:=l;a[y]^.next:=p;
end;
fillchar(q,sizeof(q),0);fillchar(f,sizeof(f),false);
f[1]:=true;q[1]:=1;head:=0;dis[1]:=0;head:=0;tail:=1;
repeat
inc(head);u:=q[head];p:=a[u];
while p^.next<>nil do
begin
p:=p^.next;
v:=p^.dot;w:=p^.v;
if dis[v]>dis[u]+w then
begin
dis[v]:=dis[u]+w;
if not f[v] then
begin
inc(tail);q[tail]:=v;
f[v]:=true;
end;
end;
end;
f[u]:=false;
until head>=tail;
for i:=1 to b do
begin
readln(x,y);
writeln(dis[x]+dis[y]);
end;
//close(input);close(output);
end.