这里介绍怎么求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的更多相关文章

  1. ACM训练计划step 2 [非原创]

    (Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...

  2. POJ训练计划

    POJ训练计划 Step1-500题 UVaOJ+算法竞赛入门经典+挑战编程+USACO 请见:http://acm.sdut.edu.cn/bbs/read.php?tid=5321 一.POJ训练 ...

  3. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  4. MPlayer

    名称   mplayer − 电影播放器 mencoder − 电影编解码器 概要   mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...

  5. python 爬取腾讯微博并生成词云

    本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...

  6. 面经 cisco

    1. 优先级反转问题及解决方法 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优 ...

  7. linux驱动(续)

    网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解      目前支持I/O多路复用的系统调用有 select,psel ...

  8. HttpServletRequest对象(一)

    javaweb学习总结(十)——HttpServletRequest对象(一) 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HT ...

  9. POJ3255 Roadblocks [Dijkstra,次短路]

    题目传送门 Roadblocks Description Bessie has moved to a small farm and sometimes enjoys returning to visi ...

随机推荐

  1. 安卓项目中使用JSON引发的一个小错误 Multiple dex files define Lorg/apache/commons/collections/Buffer

    原因: 这里添加的jar包和android自带的jar产生了冲突

  2. php版获取重定向后地址的代码分享

    如何获取重定向的地址呢?我们用php实现这样的功能,分享下我的代码,有需要的朋友参考下. 代码如下: <?php //取重定向的地址 class RedirectUrl{ //地址 var $u ...

  3. 35 个必须有的Bootstrap工具和生成器

    Bootstraptor If you think that bootstrap templates are not enough for you, you should go with bootst ...

  4. delphi xe memory leak produced in WSDLLookup.pas

    constructor TWSDLLookup.Create; begin FLookup := TDictionary<string, Variant>.Create; end; des ...

  5. Centos6.4 安装NLTK

    NLTK 安装链接 http://www.nltk.org/install.html 不知道什么原因打不开pypi 的网站  http://pypi.python.org/pypi/setuptool ...

  6. sublime text2 配置php调试环境

    步骤一: 首先确保你电脑安装了php,并把php设置到环境变量里了. 步骤二: 点击 sublime_text的“工具”->"编译系统"->"编译新系统&qu ...

  7. 关于javascript的window.onscroll方法

    ---恢复内容开始--- 今天在学习javascript的过程中被onscroll这个东西堵了一下午.心情极度郁闷. 在高度较大的网页中,我们通常会加一个返回顶部的按钮,方便用户操作. 代码如下: & ...

  8. (转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)

    网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html 在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码: struct d ...

  9. $.post()返回数据正常,但不执行success回调函数

    今天遇到一特郁闷的问题,如题:$.post()返回数据正常,但不执行success回调函数.说它郁闷是因为没毕业之前就遇到过解决了,却没有记录下来,导致卡了一下午. 像这样,post返回数据正常,但却 ...

  10. office2010 office2013打开个别PPT时需要修复的解决方法

    写在前面的废话(请直接查看正文部分):一次意外之后,需要重装Microsoft office,于是屁颠屁颠就重装了一次MS office 2013,装好后发现,打开个别ppt/pptx时打不开,提示修 ...