题目:星门跳跃 rqnoj341
题目描述
在EVE游戏中,宇宙被划分成为许多区域,每个区域中都有数目不定的星门,可以通过星门来跳跃到特定的区域(星门是双向的)。
现在你正参与BBE联军与MLGBD联盟的会战,但由于飞船受损,需要尽快回到后方的友军空间站进行维护。
试编写程序,计算出所须的最短的返回空间站时间。
为了简化问题,我们约定飞船所在的位置为区域1,空间站所在的位置为区域N。
问题规模:
对于80%的数据,1<N<=10000,1<M<50000;
对于100%的数据,1<N<=30000,1<M<150000,1<=X[],Y[]<=N,1<=Z[]<=4096;
输入格式
第1行,两个整数N,M,分别为区域的总数和星门的总数;
第2..M+1行,每行三个整数X[i],Y[i],Z[i],分别为星门连接的两个区域,以及跳跃所需时间;
输出格式
一个整数,返回空间站所需的最短时间。
样例输入
样例一 5 3 1 4 5 4 5 1 1 2 7 样例二 10 11 1 2 3 2 3 4 3 4 5 4 5 6 5 6 7 6 7 8 7 8 9 8 9 10 9 10 11 1 5 7 6 9 3
样例输出
样例一 6 样例二 28
直接读入数据就建图了,然后dijkstra 或者 spfa
这里是spfa+link的Pascal Code
program rqnoj341;
type
link=^tnode;
tnode=record
pos,long:longint;
next:link;
end;
var
n,m:longint;
first:array[0..30000+10] of link;
min:array[0..30000+10] of longint;
procedure init;
begin
assign(input,'rqnoj341.in');
assign(output,'rqnoj341.out');
reset(input);
rewrite(output);
end;
procedure outit;
begin
close(input);
close(output);
halt;
end;
procedure insert(x,y,z:longint);
var
p:link;
begin
new(p);
p^.pos:=y;
p^.long:=z;
p^.next:=first[x];
first[x]:=p;
end;
procedure readdata;
var
i,x,y,z:longint;
begin
read(n,m);
for i:=1 to m do
begin
read(x,y,z);
insert(x,y,z);
insert(y,x,z);
end;
end;
procedure main;
var
flag:boolean;
x,y,z:longint;
p:link;
begin
fillchar(min,sizeof(min),$7);
min[1]:=0;
while flag do
begin
flag:=false;
for x:=1 to n do
begin
p:=first[x];
while p<>nil do
begin
y:=p^.pos;
z:=p^.long;
if min[x]+z<min[y] then
begin
min[y]:=min[x]+z;
flag:=true;
end;
p:=p^.next;
end;
end;
end;
writeln(min[n]);
end;
begin
init;
readdata;
main;
outit;
end.