uva10986 堆优化单源最短路径(pas)
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.
uva10986 堆优化单源最短路径(pas)的更多相关文章
- 单源最短路径:Dijkstra算法(堆优化)
前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...
- luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- SPFA求单源最短路径
序 求最短路径的算法有很多,各有优劣. 比如Dijkstra(及其堆(STL-priority_queue)优化),但是无法处理负环的情况: 比如O(n^3)的Floyd算法:比如Bellman-Fo ...
- P4779 【模板】单源最短路径(标准版)
P4779 [模板]单源最短路径(标准版) 求单源最短路, 输出距离 Solution \(nlogn\) 堆优化 \(Djs\) Code #include<iostream> #inc ...
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- 【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现
Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...
- 洛谷 P4779【模板】单源最短路径(标准版)
洛谷 P4779[模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 10 ...
- 【原创】洛谷 LUOGU P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...
- luoguP3371 【模板】单源最短路径
P3371 [模板]单源最短路径 3K通过 10.7K提交 题目提供者 HansBug 标签 云端↑ 难度 普及/提高- 时空限制 1s / 128MB 题目描述 如题,给出一个有向图,请输出从某一点 ...
随机推荐
- centos7安装nexus私服2.14
今天项目经理叫搭个nexus私服,记录一下 nexus下载比较慢,可在本地下载,然后用sftp上传到linux系统去,下载地址https://www.sonatype.com/download-oss ...
- Redis、Memcache和MongoDB的区别(转)
1.性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcache差不多,要大于mongodb 2.操作的便利性 memcache数据结构单一 redis丰富一些,数据 ...
- DTD总结
DTD 可以检测 XNM 文档的结构是否正确,就好像文章中用来保证结构正确的语法规则一样. 引入 DTD 1.引入私有的 DTD 文件,URI 可以使相对地址或绝对地址 <!DOCTYPE 根元 ...
- 亲历腾讯WEB前端开发三轮面试经历及面试题
[一面]~=110分钟 2014/09/24 11:20 星期三 进门静坐30分钟做题. 填空题+大题+问答题 >>填空题何时接触电脑 何时接触前端运算符 字符串处理 延 ...
- PHP数组合并+与array_merge的区别分析 & 对多个数组合并去重技巧
PHP中两个数组合并可以使用+或者array_merge,但之间还是有区别的,而且这些区别如果了解不清楚项目中会要命的! 主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意 ...
- C和指针 第十三章 习题
1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...
- C和指针 第九章 字符串 字符 字节
C语言中没有字符串类型,字符串是以NUL结尾的字符数组组成的. 高级字符串查找: //计算字符串起始部分,有多少字符是在group中 size_t strspn(char const * str, c ...
- am335x watchdog 设备出错
问题描述: am335x watchdog 设备节点打开失败. 如果是直接将omap_wdt 直接编译成uImage,这样会出现打开文件节点失败的情况. 如果单独编译成模块在后面文件系统内插入则不会. ...
- Java批量文件打包下载
经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...
- PHP实验三
1.输出下列语句地结果 <?php // while语句应用 $i = 1; while ( $i <= 20) { echo $i; if ( $i < 10 ) echo &qu ...