poj 2449 Remmarguts' Date(K短路,A*算法)

2024-08-28 10:38

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

http://poj.org/problem?id=2449


大致题意:给出一个有向图,求从起点到终点的第K短路。


K短路与A*算法详解  学长的博客。。。

算法过程

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#define LL long long
#define _LL __int64
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1010;
const int maxm = 100010;struct node
{int u,v,w;
};int s,t,k;
int n,m;
vector <struct node> edge[maxn],edge1[maxn]; //邻接表存图以及反向图
int dis[maxn]; // 终点到所有点的最短路
int time[maxn];// 每个点的出队列次数
int ans;bool operator > (const struct node &a, const struct node &b)
{return a.w+dis[a.v] > b.w + dis[b.v];
}
priority_queue < node, vector<node>, greater<node> >q;void init()
{for(int i = 1; i <= n; i++){edge[i].clear();edge1[i].clear();}
}//spfa求终点到其他左右点的最短路
void spfa() 
{int inque[maxn];queue<int> que;while(!que.empty()) que.pop();memset(inque,0,sizeof(inque));memset(dis,INF,sizeof(dis));dis[t] = 0;inque[t] = 1;que.push(t);while(!que.empty()){int u = que.front();que.pop();inque[u] = 0;for(int i = 0; i < (int)edge1[u].size(); i++){int v = edge1[u][i].v;int w = edge1[u][i].w;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;if(!inque[v]){inque[v] = 1;que.push(v);}}}}
}void solve()
{while(!q.empty()) q.pop();memset(time,0,sizeof(time));struct node tmp;bool flag = false;//起点进队列tmp.v = s;tmp.w = 0;q.push(tmp);while(!q.empty()){struct node u = q.top();q.pop();time[u.v]++;if(time[u.v] >= k) //出队次数大于等于K时{if(u.v == t) //如果是终点,判断与起点是否相同//若不相同,当前值便是第K短路,否则第K+1次才是最短路{if(t != s || (t == s && time[u.v] == k+1)){flag = true;ans = u.w;break;}}if(time[u.v] > k)//如果不是终点,当出队次数大于K次就不再进队列continue;}int now = u.v;for(int i = 0; i < (int)edge[now].size(); i++){struct node tmp;tmp.v = edge[now][i].v;tmp.w = u.w + edge[now][i].w;q.push(tmp);}}if(!flag)ans = -1;
}int main()
{while(~scanf("%d %d",&n,&m)){init();int u,v,w;for(int i = 1; i <= m; i++){scanf("%d %d %d",&u,&v,&w);edge[u].push_back( (struct node){u,v,w} );edge1[v].push_back( (struct node) {v,u,w} );}scanf("%d %d %d",&s,&t,&k);spfa();solve();printf("%d\n",ans);}return 0;
}



这篇关于poj 2449 Remmarguts' Date(K短路,A*算法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.