poj2449 Remmarguts' Date --- k短路模板(SPFA+A*)

2024-05-28 10:58

本文主要是介绍poj2449 Remmarguts' Date --- k短路模板(SPFA+A*),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给一个图,起点s、终点t、k,求起点到终点的第k短路。


基本思路:

首先反向图中求出终点 t 到其他所有点的距离(预处理优化),

再从起点开始使用优先队列进行宽搜,用cnt记录到达终点的次数,当cnt==k时的路径长度即为所得。

搜索的方向用一个估价函数 f=g+h 来确定,其中g表示到当前点的路径长度,h表示当前点到终点的最短路径,即之前的预处理。


A*算法结合了启发式搜索(充分利用题目所给信息来动态的做出决定,使搜索次数大大降低),和形式化方法(不利用图给出的信息,仅利用数学的形式分析,如dij算法)。

它通过一个估价函数 f(h) 来决定搜索方向。估价函数=当前值+当前位置到终点的距离,每次扩展估价函数值最小的一个。


#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000007
using namespace std;const int maxn=1010;int d[maxn],head[maxn],head2[maxn],n,m,h;
bool vis[maxn];struct node
{int v,w,next;
}e[100010],e2[100010];struct node1
{int v,g,f;// f=g+hbool operator < (const node1 &r) const{if(r.f==f) return r.g<g;return r.f<f;}
};void init()
{memset(head,-1,sizeof head);memset(head2,-1,sizeof head2);memset(d,0x3f,sizeof d);h=0;
}void addedge(int u,int v,int w)
{e[h].v=v;e[h].w=w;e[h].next=head[u];head[u]=h;e2[h].v=u;//反向存图 找从终点到其他点的最短路径e2[h].w=w;e2[h].next=head2[v];head2[v]=h++;
}bool spfa(int s)
{memset(vis,0,sizeof vis);queue<int> q;d[s]=0;q.push(s);while(!q.empty()){int now=q.front();q.pop();vis[now]=0;for(int i=head2[now];i!=-1;i=e2[i].next){if(d[now]+e2[i].w<d[e2[i].v]){d[e2[i].v]=d[now]+e2[i].w;if(!vis[e2[i].v]){vis[e2[i].v]=1;q.push(e2[i].v);}}}}
}int astar(int s,int t,int k)
{if(s==t) k++;//起点=终点 则最短路为0 要注意哦if(d[s]==inf) return -1;priority_queue<node1> q;int cnt=0;node1 tmp,to;tmp.v=s;tmp.g=0;tmp.f=tmp.g+d[tmp.v];q.push(tmp);while(!q.empty()){tmp=q.top();q.pop();if(tmp.v==t) cnt++;if(cnt==k) return tmp.g;for(int i=head[tmp.v];i!=-1;i=e[i].next){to.v=e[i].v;to.g=tmp.g+e[i].w;to.f=to.g+d[to.v];q.push(to);}}return -1;
}int main()
{int u,v,w,s,t,k;while(~scanf("%d%d",&n,&m)){init();for(int i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);addedge(u,v,w);}scanf("%d%d%d",&s,&t,&k);spfa(t);int ans=astar(s,t,k);printf("%d\n",ans);}return 0;
}


这篇关于poj2449 Remmarguts' Date --- k短路模板(SPFA+A*)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010370

相关文章

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财