poj3255,poj2449
这里介绍怎么求k短路
A*搜索 估价函数f[i]=g[i]+h[i];
在这里g[i]表示到达点i当前路径长,h[i]表示点i到达终点的最短距离
在搜索中,每次都取队列估价函数值最小的点,然后把它所能到达的点更新进入队列
显然这需要一个优先队列来维护(heap)
当终点第k次出队时,当前路径长度就是k短路
const max=;
type link=^node;
node=record
po,len:longint;
next:link;
end;
point=record
data,num:longint;
end;
var w,ow:array[..] of link;
v:array[..] of boolean;
d:array[..] of longint;
heap:array[..] of point; //堆维护估价函数值
st,en,i,n,m,j,t,k,x,y,z,s:longint;
p:link; procedure sift(x:longint); //堆的下沉
var i,j:longint;
begin
i:=x;
j:=i*;
while j<=t do
begin
if (j+<=t) and (heap[j].data>heap[j+].data) then inc(j);
if heap[i].data>heap[j].data then
begin
swap(heap[i],heap[j]);
i:=j;
j:=i*;
end
else exit;
end;
end; procedure up(x:longint); //堆的上浮
var i,j:longint;
begin
i:=x;
j:=i div ;
while j> do
begin
if heap[i].data<heap[j].data then
begin
swap(heap[i],heap[j]);
i:=j;
j:=i div ;
end
else exit;
end;
end; procedure add(x,y:longint;var q:link);
var p:link;
begin
new(p);
p^.po:=y;
p^.len:=z;
p^.next:=q;
q:=p;
end; procedure dij; //求点到终点的距离
var p:link;
begin
fillchar(v,sizeof(v),false);
v[en]:=true;
for i:= to n do
d[i]:=max;
d[en]:=;
p:=ow[en];
while p<>nil do
begin
d[p^.po]:=min(d[p^.po],p^.len); //用邻接表重要的细节
p:=p^.next;
end;
for i:= to n- do
begin
x:=max;
y:=;
for j:= to n do
if not v[j] and (d[j]<x) then
begin
x:=d[j];
y:=j;
end;
if x=max then exit;
v[y]:=true;
p:=ow[y];
while p<>nil do
begin
d[p^.po]:=min(d[p^.po],p^.len+x);
p:=p^.next;
end;
end;
end; function astar(st,ed:longint):longint;
var p:link;
begin
heap[].data:=d[st];
heap[].num:=st;
t:=;
s:=;
astar:=-;
while t<> do
begin
x:=heap[].num; //退队
y:=heap[].data-d[x];
swap(heap[],heap[t]);
dec(t);
sift();
if x=en then
begin
s:=s+;
if s=k then exit(y);
end;
p:=w[x];
while p<>nil do //更新所有能到达的点入队
begin
inc(t);
heap[t].num:=p^.po;
heap[t].data:=y+p^.len+d[p^.po];
up(t);
p:=p^.next;
end;
end;
end; begin
readln(n,m);
for i:= to m do
begin
readln(x,y,z);
add(x,y,w[x]);
add(y,x,ow[y]); //注意有向需反向建边,快速求点到终点的距离
end;
readln(st,en,k);
if st=en then inc(k); //注意终点与起点重合时,路径为0的不算
dij;
writeln(astar(st,en));
end.
而对于poj3255,求无向图的次短路也可以用A*,在n<=5000时还是可以过的,注意那时候就不需要反向建边了
k短路算法还是很好理解的
poj3255,poj2449的更多相关文章
- ACM训练计划step 2 [非原创]
(Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...
- POJ训练计划
POJ训练计划 Step1-500题 UVaOJ+算法竞赛入门经典+挑战编程+USACO 请见:http://acm.sdut.edu.cn/bbs/read.php?tid=5321 一.POJ训练 ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- MPlayer
名称 mplayer − 电影播放器 mencoder − 电影编解码器 概要 mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...
- python 爬取腾讯微博并生成词云
本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...
- 面经 cisco
1. 优先级反转问题及解决方法 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优 ...
- linux驱动(续)
网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解 目前支持I/O多路复用的系统调用有 select,psel ...
- HttpServletRequest对象(一)
javaweb学习总结(十)——HttpServletRequest对象(一) 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HT ...
- POJ3255 Roadblocks [Dijkstra,次短路]
题目传送门 Roadblocks Description Bessie has moved to a small farm and sometimes enjoys returning to visi ...
随机推荐
- ES6学习笔记(九)
1.概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制 ...
- Linux系统下ssh的相关配置详细解析
Linux系统下ssh的相关配置进行了详细的分析介绍. ssh是大家常用的登录linux服务器的方式,但是为了安全考虑,有时候我们需要针对ssh做一些特殊处理,本文记录笔者曾经做过的一些修改,供大家参 ...
- WordPress 后台禁用Google Open Sans字体,加速网站
解决方法很简单,安装启用 Disable Google Fonts 或者 Remove Open Sans font Link from WP core 其中之一即可.或者如果你没有使用WP自带的官方 ...
- Beaglebone Back学习五(PWM测试)
PWM测试 参考链接 1 Enable PWM on BeagleBone with Device Tree overlays 2Using PWM on the Beaglebone Black 3 ...
- fragment第二次载入就报错
1.布局中加入一个<fragment 标签,第一次载入的时候是正常的,第二次加载的时候,就直接crashed,退出 2.查到原因Caused by: java.lang.IllegalArgum ...
- Java字符串之性能优化
基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...
- 2038: [2009国家集训队]小Z的袜子(hose) - BZOJ
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只 ...
- centos7 更新yum安装源
系统自带的yum安装源有些软件找不到 这里我们使用阿里云的源 1.加源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/re ...
- org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.chen.vo.Dept.parentId
异常描述:执行以下的addAsHaveParentId2方法出现此异常: /*-----------------------类Dept.Dept.hbm.xml有parentId属性(数据库中有此列) ...
- [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg
在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...