【Remmarguts' Date】
一道来自POJ2449的题,它融合了单源点最短路算法、启发式搜索,让我们对“启发式”有更深的理解和体会。Wow!
·英文题,述大意:
读入n,m(n<=1000,m<=100000),表示节点数和边数,接下来m行输入每条有向边的端点和权值。之后输入起点、终点和K。求出第K短路的长度,没有就输出-1.(注意:①一条起点到终点的路径上可以包含多个相同点,起点终点也可以包含多个!②起点和终点可以重合,而且最短路就是0)
·分析:
首先就是要搜索。不过搜索的判断依据要做变化,决不是以前简单的dis比大小了。说专业点就是尝试要构造启发式f()函数,说通俗点,就是尝试更改搜索队列的优先级关键字信息,使得满足条件。
在搜索里,由于不是找最短路,所以vis[]荡然无存。我们需要一种优先队列,使得当前弹出的是目前最短路。如何寻到第K短路:找到一条最短路,用cnt记一下,表示当前找到的起点到终点的第cnt短路,直至K==cnt。
美妙之处在于怎样快速找出当前搜索到的点中,顺着哪一个点先走下去会得到一条到终点的当前最短路。也就是我们要具有一种预测未来的能力,它不同于正常的最短路思路:不断尝试,不断贪心。预测未来能力能够知道按某一个点先开始展开搜索,它一定在未来先以最短路抵达终点。
我们不具有预测未来的能力,所以只能预处理。预处理以终点为单源点的最短路dis数组。那么在我们使用搜索的时候,只需要将起点到当前点距离与当前点和终点的最短路距离的和作为比较关键字存入优先队列中,这样一来每一步优先队列都为您维护着最有希望的那个点(the most promising point)。
在代码来到之前有一个申明:虽说vis数组已经不在了,但是大米饼依旧用它的名字在搜索中表示当前点被访问的次数(因为每个点最多被访问K次)
#include<stdio.h>
#include<queue>
#include<cstring>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
#define inf 100000000
using namespace std;const int N=;struct E{int v,next,w;}e[N*N*];
struct Kth{int u,f;bool operator<(const Kth& a)const{return f>a.f;}};
int n,m,head[N],back[N],k=,S,T,K,dis[N],ans=-;
void ADD(int u,int v,int w,int* H){e[k]=(E){v,H[u],w};H[u]=k++;}
void SPFA()
{
queue<int>q;bool inq[N]={};go(i,,n)dis[i]=inf;dis[T]=;q.push(T);
while(!q.empty())
{
int u=q.front();q.pop();inq[u]=;
fo(i,back,u)if(dis[u]+e[i].w<dis[v]){
dis[v]=dis[u]+e[i].w;!inq[v]?q.push(v),inq[v]=:;}
}
}
void BFS()
{
if(dis[S]>=inf)return;priority_queue<Kth>q;
int vis[N]={};q.push((Kth){S,dis[S]});K+=S==T;
while(!q.empty())
{
Kth p=q.top();q.pop();int u=p.u;vis[u]++;
if(vis[T]==K){ans=p.f;return;}fo(i,head,u)if(vis[v]<K)
q.push((Kth){v,p.f-dis[u]+e[i].w+dis[v]});
}
}
int main(){scanf("%d%d",&n,&m);go(i,,m){int u,v,w;scanf("%d%d%d",&u,&v,&w);
ADD(u,v,w,head),ADD(v,u,w,back);}scanf("%d%d%d",&S,&T,&K);
SPFA();BFS();printf("%d\n",ans);return ;
}//Paul_Guderian
I love you!always!Tme is nothing——The Time Traveller,Henry
【Remmarguts' Date】的更多相关文章
- 【js Date】时间字符串、时间戳转换成今天,明天,本月等文字日期
作为前端开发攻城师,难免对时间进行各种计算和格式转换,一个js的Date对象统统可以搞定.下例是将一个具体的时间转换成今天.明天.几天之内.本月等文字描述的日期的工具函数,也可以基于它扩展,多应用于网 ...
- 【system.date】使用说明
对象:system.date 说明:提供一系列针对日期类型的操作 目录: 方法 返回 说明 system.date.isDate( date_string ) [True | False] 判断 ...
- HttpTool.java 【暂保留】
备注 在 java tool util 工具类 中已存在 HttpTool.java 该类为java源生态的http 请求工具,不依赖第三方jar包 ,即插即用. package kingtool; ...
- 【废弃中】JavaScript 内置Object
创建: 2017/09/24 更新: 2018/01/22 增加window对象内容的链接 更改标题: [JavaScript 主要的自带Object] -> [JavaScript 内置Obj ...
- 【POJ】【2449】Remmarguts' Date
K短路/A* 经(luo)典(ti) K短路题目= = K短路学习:http://www.cnblogs.com/Hilda/p/3226692.html 流程: 先把所有边逆向,做一遍dijkstr ...
- poj2449 Remmarguts' Date【A*算法】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4303855.html ---by 墨染之樱花 [题目链接]:http://poj.org/ ...
- poj 2449 Remmarguts' Date 【SPFA+Astar】【古典】
称号:poj 2449 Remmarguts' Date 意甲冠军:给定一个图,乞讨k短路. 算法:SPFA求最短路 + AStar 以下引用大牛的分析: 首先,为了说话方便,列出一些术语: 在启示式 ...
- 【POJ 2449】 Remmarguts' Date
[题目链接] http://poj.org/problem?id=2449 [算法] A*(启发式搜索) 首先,求第k短路可以用优先队列BFS实现,当T第k次入队时,就求得了第k短路,但是,这种做法的 ...
- 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型
前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法6.操作方法 ...
随机推荐
- 用python实现简单购物车功能
all_asset = 0 i1 = input("请输入总资产:") all_asset = int(i1) goods = [ {'name':'电脑','price':199 ...
- BAT齐聚阿里安全-ASRC生态大会:呼吁联合共建网络安全白色产业链
图说:近日,阿里安全-ASRC生态大会在杭州举行,包括BAT在内的20余家国内知名互联网企业代表,回顾过去一年网络安全面临的问题与挑战,共谋生态安全治理思路. "123456.111111. ...
- Python 迭代器之列表解析与生成器
 [TOC] 1. 列表解析 1.1 列表解析基础 列表解析把任意一个表达式应用到一个迭代对象中的元素 Python内置ord函数会返回一个字符的ASCII整数编码(chr函数是它的逆过程, 它将A ...
- python之路--day13-模块
1,什么是模块 模块就是系统功能的集合体,在python中,一个py文件就是一个模块, 例如:module.py 其中module叫做模块名 2,使用模块 2.1 import导入模块 首次带入模块发 ...
- phalcon框架命名空间
命名空间第一影像就是实际上就相当宏定义,就是需要把一个很长的带有路径的类文件指定一个空间,然后就可直接用简单简写模式 当然如果是外部文件需要首先引入外部文件,如果不引入外部文件还是会报错.一般最会出错 ...
- Code::Blocks出现64-Bit mode not compled in解决方法
原因是:Settings->compilter你选了Target x86 _64(64bit),选择Target x86 _32(32bit)即可 废了老半天劲才找到原因,希望能让朋友们少走弯路
- ArrayList源码学习----JDK1.7
什么是ArrayList? ArrayList是存储一组数据的集合,底层也是基于数组的方式实现,实际上也是对数组元素的增删改查:它的主要特点是: 有序:(基于数组实现) 随机访问速度快:(进行随机访问 ...
- angular2 学习笔记 ( Dynamic Component 动态组件)
更新 2018-02-07 详细讲一下 TemplateRef 和 ViewContainerRef 的插入 refer : https://segmentfault.com/a/1190000008 ...
- OAuth2.0学习(1-2)OAuth2.0的一个企业级应用场景 - 新浪开放平台微博OAuth2.0认证
http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 开发者可以先浏览OAuth2.0的接口文档,熟悉OAuth2.0的接口及参数的含义,然后我们根据应用场景各自 ...
- 记java应用linux服务单个CPU使用率100%分析
之前在做项目的过程中,项目完成后在linux服务器上做性能测试,当服务跑起来的时候发现cpu使用率很奇怪,java应用把单个cpu跑满了,其他cpu利用率0%. 刚开始遇到这问题的时候我第一时间反应使 ...