tyvj P1326 - 剑人合一

P1326 - 剑人合一

From lwz_th    Normal (OI) 总时限:10s    内存限制:128MB

描述 Description

他们飘呀飘,飘呀飘,飘呀飘,飘呀飘~~~ 经过七七八十一天的漂泊,残雪、夏夜和水手2011,终于到达了无尽的深渊--lcyz岛,正当他们准备从后门登陆时,突然半路杀出了一个程咬金--一个身高十二尺,腰围380的怪物。这正是传说中lcyz岛上的上古怪物,通道守护者,但是我们都叫他门卫。根据上古传说,只有拿到岛上的上古兵器毛剑,才可打败门卫。有了毛剑,神马都是浮云、、、 毛剑被珍藏在一个灰常隐秘的地下室里,残雪经过重重险阻,终于进入了剑冢,此时毛剑静静地插在一块由纯金打造的纯金上。残雪看见此景,不由感叹一声,好剑啊。又大喊一声:看我剑人合一。说罢,便伸手欲抽剑,但是,一个迷宫瞬间弹了出来(别问我怎么弹出来的-。-),这个迷宫情况如下: 迷宫中有n块区域,其中m条道路,如果从a区域到b区域存在一条道路的话,残雪要想通过这条道路,需要耗费一定的体力值,但是,某些道路上摆放着食物,残雪经过这些道路,可以补充一定的体力值,可以理解为权值为负的道路,现在残雪还要留着体力去打败门岗,需要用最小的体力值拿到毛剑,现在就请你帮助他们取出毛剑。残雪所处的位置在1区域,毛剑所处的位置在n区域。

输入格式 InputFormat

第一行:一个n,表示区域数目。 第二行:m,表示存在m条道路。 以下m行: 每行三个数:x、y、z 区域x、y的标号和他们之间耗费的体力值z

输出格式 OutputFormat

从残雪到毛剑所耗费的最小体力(结果为负则为补充体力)。

样例输入 SampleInput [复制数据]

3
3
1 2 5
2 3 10
1 3 20

样例输出 SampleOutput [复制数据]

15

数据范围和注释 Hint

对于30%的数据,有n<=1000,m<=2000 对于50%的数据,有n<=5000,m<=10000; 对于100%的数据,有n<=10000,m<=50000; 保证此题所涉及的所有数据都是整数。

时间限制 TimeLimitation

1S
题解:裸地SPFA 注意邻接表存 要不MLE
program tyvj1326;
const max=500000;
var q:array[1..max] of integer;
   a:array[0..10000] of longint;
   b:array[0..50000,1..3] of longint;
   mark:array[1..10000] of boolean;
   d:array[1..10000] of longint;
   head,tail,n,m,x,y,i,k,now,dist,s,z:longint;
procedure push(k:longint);
begin
   head:=head mod max+1;
   q[head]:=k;
   mark[k]:=true;
end;
function pop:longint;
begin
pop:=q[tail];
tail:=tail mod max+1;
end;
begin
fillchar(b,sizeof(b),0);
fillchar(a,sizeof(a),0);
readln(n);
readln(m);
for i:=1 to m do begin
   readln(x,y,dist);
   inc(z);b[z,1]:=y;b[z,2]:=dist;b[z,3]:=a[x];a[x]:=z;
   end;
for i:=1 to n do d[i]:=maxlongint;
fillchar(mark,sizeof(mark),false);
head:=0;tail:=1;
d[1]:=0;
push(1);
while head>=tail do begin
   k:=pop;s:=a[k];
       while s<>0 do begin
       now:=b[s,1];dist:=b[s,2];
       if d[now]>d[k]+dist then begin
           d[now]:=d[k]+dist;
           if not mark[now] then push(now);
       end;
       s:=b[s,3];
   end;
   mark[k]:=false;
end;
writeln(d[n]);
end.

posted on 2012-10-31 11:12  馒头~blue  阅读(307)  评论(0编辑  收藏  举报

导航