比赛 |
20101110 |
评测结果 |
AAAAAAAAAA |
题目名称 |
奶牛派对 |
最终得分 |
100 |
用户昵称 |
ybh |
运行时间 |
0.000 s |
代码语言 |
Pascal |
内存使用 |
0.00 MiB |
提交时间 |
2010-11-10 19:35:58 |
显示代码纯文本
{Party
最短路径
Author:yangbohua
Time:2010-11-10}
program party;
type
bian=record
v,w,next:longint;
end;
he=record
v,d:longint;
end;
var
hpos1,hpos2,list1,list2:array[0..1001] of longint;
map1,map2:array[0..100001] of bian;
heap1,heap2:array[0..1001] of he;
n,m,s,i,j,r1,r2,r3,hl,i1,p,max:longint;
procedure swap1(x,y:longint);
begin
heap1[0]:=heap1[x];
heap1[x]:=heap1[y];
heap1[y]:=heap1[0];
hpos1[heap1[x].v]:=x;
hpos1[heap1[y].v]:=y;
end;
procedure swap2(x,y:longint);
begin
heap2[0]:=heap2[x];
heap2[x]:=heap2[y];
heap2[y]:=heap2[0];
hpos2[heap2[x].v]:=x;
hpos2[heap2[y].v]:=y;
end;
begin
assign(input,'party.in');
reset(input);
assign(output,'party.out');
rewrite(output);
readln(n,m,s);
fillchar(list1,sizeof(list1),0);
fillchar(map1,sizeof(map1),0);
fillchar(list2,sizeof(list2),0);
fillchar(map2,sizeof(map2),0);
for i:=1 to m do
begin
readln(r1,r2,r3);
map1[i].v:=r2;
map1[i].w:=r3;
map1[i].next:=list1[r1];
list1[r1]:=i;
map2[i].v:=r1;
map2[i].w:=r3;
map2[i].next:=list2[r2];
list2[r2]:=i;
end;
for i:=1 to n do
begin
heap1[i].v:=i;
heap1[i].d:=maxlongint;
hpos1[i]:=i;
end;
heap1[s].d:=0;
swap1(1,s);
hl:=n;
while hl>0 do
begin
i:=heap1[1].v;
swap1(1,hl);
hl:=hl-1;
i1:=2;
while i1<=hl do
begin
if (i1<hl) and (heap1[i1+1].d<heap1[i1].d)
then inc(i1);
if heap1[i1].d<heap1[i1 div 2].d then
begin
swap1(i1,i1 div 2);
i1:=i1*2;
end
else break
end;
p:=list1[i];
while p>0 do
begin
j:=map1[p].v;
if hpos1[j]<=hl then
if heap1[hpos1[i]].d+map1[p].w<heap1[hpos1[j]].d then
begin
heap1[hpos1[j]].d:=heap1[hpos1[i]].d+map1[p].w;
j:=hpos1[j];
while (j>1) and (heap1[j].d<heap1[j div 2].d) do
begin
swap1(j,j div 2);
j:=j div 2;
end;
end;
p:=map1[p].next;
end;
end;
for i:=1 to n do
begin
heap2[i].v:=i;
heap2[i].d:=maxlongint;
hpos2[i]:=i;
end;
heap2[s].d:=0;
swap2(1,s);
hl:=n;
while hl>0 do
begin
i:=heap2[1].v;
swap2(1,hl);
hl:=hl-1;
i1:=2;
while i1<=hl do
begin
if (i1<hl) and (heap2[i1+1].d<heap2[i1].d)
then inc(i1);
if heap2[i1].d<heap2[i1 div 2].d then
begin
swap2(i1,i1 div 2);
i1:=i1*2;
end
else break
end;
p:=list2[i];
while p>0 do
begin
j:=map2[p].v;
if hpos2[j]<=hl then
if heap2[hpos2[i]].d+map2[p].w<heap2[hpos2[j]].d then
begin
heap2[hpos2[j]].d:=heap2[hpos2[i]].d+map2[p].w;
j:=hpos2[j];
while (j>1) and (heap2[j].d<heap2[j div 2].d) do
begin
swap2(j,j div 2);
j:=j div 2;
end;
end;
p:=map2[p].next;
end;
end;
max:=0;
for i:=1 to n do
if heap1[hpos1[i]].d+heap2[hpos2[i]].d>max
then max:=heap1[hpos1[i]].d+heap2[hpos2[i]].d;
writeln(max);
close(input);
close(output)
end.