var n,m,s,t,v,i,a,b,c:longint;//这道题的代码不是这个,在下面
first,tr,p,q:array[..]of longint;
next,eb,ew:array[..]of longint;
procedure swap(a,b:longint);
var t:longint;
begin
t:=tr[a];tr[a]:=tr[b];tr[b]:=t;
t:=p[a];p[a]:=p[b];p[b]:=t;
t:=q[p[a]];q[p[a]]:=q[p[b]];q[p[b]]:=t;
end;
procedure sw(var a,b:longint);
var t:longint;
begin
t:=a;a:=b;b:=t;
end;
procedure up(a:longint);
begin
if a= then exit;
if tr[a]<tr[a div ] then
begin
swap(a,a div );
up(a div );
end;
end;
procedure down(a:longint);
var b,c:longint;
begin
b:=;
while(b<=a div )do
begin
c:=b*;
if(tr[c]>tr[c+])and(c<n)then
c:=c+;
if tr[c]<tr[b] then
swap(b,c);
b:=c;
end;
end;
procedure input;
begin
v:=v+;
eb[v]:=b;
ew[v]:=c;
next[v]:=first[a];
first[a]:=v;
end;
begin
readln(n,m,s,t);
v:=;
fillchar(first,sizeof(first),);
for i:= to m do
begin
readln(a,b,c);
input;
sw(a,b);
input;
end;
fillchar(tr,sizeof(tr),$7f);
tr[s+]:=;
for i:= to n do
begin
p[i]:=i-;
q[i-]:=i;
end;
up(s+);
write('Case #1: ');
repeat
a:=p[]; //top
if a=t then
begin
if tr[]= then
writeln('unreachable')
else
writeln(tr[]);
break;
end;
b:=first[a];
while(b<>)do
begin
c:=eb[b];
if(tr[q[a]]+ew[b]<tr[q[c]])then
begin
tr[q[c]]:=tr[q[a]]+ew[b];
up(q[c]);
end;
b:=next[b];
end;
swap(,n);
n:=n-;
down(n);
until false;
end.

单纯的堆优化dijkstra,

加上多组数据以后(该题AC):

var n,m,s,t,v,i,a,b,c,nn,ii:longint;
first,tr,p,q:array[..]of longint;
next,eb,ew:array[..]of longint;
procedure swap(a,b:longint);
var t:longint;
begin
t:=tr[a];tr[a]:=tr[b];tr[b]:=t;
t:=p[a];p[a]:=p[b];p[b]:=t;
t:=q[p[a]];q[p[a]]:=q[p[b]];q[p[b]]:=t;
end;
procedure sw(var a,b:longint);
var t:longint;
begin
t:=a;a:=b;b:=t;
end;
procedure up(a:longint);
begin
if a= then exit;
if tr[a]<tr[a div ] then
begin
swap(a,a div );
up(a div );
end;
end;
procedure down(a:longint);
var b,c:longint;
begin
b:=;
while(b<=a div )do
begin
c:=b*;
if(tr[c]>tr[c+])and(c<n)then
c:=c+;
if tr[c]<tr[b] then
swap(b,c);
b:=c;
end;
end;
procedure input;
begin
v:=v+;
eb[v]:=b;
ew[v]:=c;
next[v]:=first[a];
first[a]:=v;
end;
begin
readln(nn);
for ii:= to nn do
begin
readln(n,m,s,t);
v:=;
fillchar(first,sizeof(first),);
for i:= to m do
begin
readln(a,b,c);
input;
sw(a,b);
input;
end;
fillchar(tr,sizeof(tr),$7f);
tr[s+]:=;
for i:= to n do
begin
p[i]:=i-;
q[i-]:=i;
end;
up(s+);
write('Case #',ii,': ');
repeat
a:=p[]; //top
if a=t then
begin
if tr[]= then
writeln('unreachable')
else
writeln(tr[]);
break;
end;
b:=first[a];
while(b<>)do
begin
c:=eb[b];
if(tr[q[a]]+ew[b]<tr[q[c]])then
begin
tr[q[c]]:=tr[q[a]]+ew[b];
up(q[c]);
end;
b:=next[b];
end;
swap(,n);
n:=n-;
down(n);
until false;
end;
end.

最新文章

  1. 使用D3绘制图表(3)--添加坐标轴和文本标签
  2. JavaScript笔记杂谈篇(啥都有)
  3. init/main.c
  4. editplus如何设置不自动备份
  5. Spring中Bean的命名问题及ref和idref之间的区别
  6. javaDay1 基础知识
  7. Oracle EBS-SQL (PO-5):采购订单控制信息查询.sql
  8. 通过终端使用ssh-keygen免密码登录远程服务器
  9. 多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构
  10. boost asio 学习(四)使用strand将任务排序
  11. Implement strStr() leetcode java
  12. UVA 11796 Dog Distance(几何)
  13. SpringBoot简单的REST风格例子
  14. 用Hadoop AVRO进行大量小文件的处理(转)
  15. 基于FPGA的I2C读写EEPROM
  16. 微信 JS-SDK 签名验证
  17. Shiro安全框架学习笔记
  18. Android中的Audio播放:竞争Audio之Audio Focus的应用
  19. linux后退文件夹命令
  20. linux 程序启动与停止管理脚本

热门文章

  1. win7计划任务执行php脚本方法
  2. hibernate的集中持久化方法的区别
  3. C:Wordpress自定义文章类型(图视频)
  4. [Head First设计模式]策略模式
  5. 二叉树的层序遍历 BFS
  6. 第2月第6天 iOS 运行时添加属性和方法
  7. 【Alpha版本】冲刺阶段——Day 10
  8. Asp.Net Core--自定义基于策略的授权
  9. SVN版本控制与分支设置
  10. IIs管理服务一直启动失败的原因之一