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

相关文章

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

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()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、