Made In Heaven(A*算法初步学习)

2023-11-08 06:21
文章标签 算法 学习 初步 made heaven

本文主要是介绍Made In Heaven(A*算法初步学习),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. However, Pucci the father somehow knows it and wants to stop her. There are NNN spots in the jail and MMM roads connecting some of the spots. JOJO finds that Pucci knows the route of the former (K−1)(K-1)(K−1)-th shortest path. If Pucci spots JOJO in one of these K−1K-1K−1 routes, Pucci will use his stand Whitesnake and put the disk into JOJO's body, which means JOJO won't be able to make it to the destination. So, JOJO needs to take the KKK-th quickest path to get to the destination. What's more, JOJO only has TTT units of time, so she needs to hurry.

JOJO starts from spot SSS, and the destination is numbered EEE. It is possible that JOJO's path contains any spot more than one time. Please tell JOJO whether she can make arrive at the destination using no more than TTT units of time.

Input

There are at most 505050 test cases.

The first line contains two integers NNN and MMM (1≤N≤1000,0≤M≤10000)(1 \leq N \leq 1000, 0 \leq M \leq 10000)(1≤N≤1000,0≤M≤10000). Stations are numbered from 111 to NNN.

The second line contains four numbers S,E,KS, E, KS,E,K and TTT ( 1≤S,E≤N1 \leq S,E \leq N1≤S,E≤N, S≠ES \neq ES≠E, 1≤K≤100001 \leq K \leq 100001≤K≤10000, 1≤T≤1000000001 \leq T \leq 1000000001≤T≤100000000 ).

Then MMM lines follows, each line containing three numbers U,VU, VU,V and WWW (1≤U,V≤N,1≤W≤1000)(1 \leq U,V \leq N, 1 \leq W \leq 1000)(1≤U,V≤N,1≤W≤1000) . It shows that there is a directed road from UUU-th spot to VVV-th spot with time WWW.

It is guaranteed that for any two spots there will be only one directed road from spot AAA to spot BBB (1≤A,B≤N,A≠B)(1 \leq A,B \leq N, A \neq B)(1≤A,B≤N,A≠B), but it is possible that both directed road <A,B><A,B><A,B> and directed road <B,A><B,A><B,A> exist.

All the test cases are generated randomly.

Output

One line containing a sentence. If it is possible for JOJO to arrive at the destination in time, output "yareyaredawa" (without quote), else output "Whitesnake!" (without quote).

样例输入复制

2 2
1 2 2 14
1 2 5
2 1 4

样例输出复制

yareyaredawa

先说说A*算法;

我也是初学者,对A*算法懂得不多,看了许多别人的博客,他们写的都很透彻,同时也很专业,

我就用不专业的话说说我对A*算法的理解;

大佬请略过。。。。。。。。。。。。

A*算法重要的应该是它能起到一个预知的效果,看别人的博客都知道一个函数F=G+H;而他的最重要的在于H函数;

H函数的作用是用来判断这个点到终点的距离,就像图中的H和G,g记录了你走过的距离,h记录着当前的到终点你还要走的距离,一半H需要自己通过计算得到,如本题的H就是可以由终点计算到其他点的距离得到每一个点到终点的距离,所以H函数写的好的程序就好,而对于当前的该怎样走才是最短的,就需要比较它周围的点的G加上H的值,值越小,到终点的距离越大。有时候H很难算出这时就可以用一些特殊的方式求H值比如直接取两点距离,但是H需要<=实际的值,如果估计的比实际的大,那估计也很难的出正确结果,(反正我是不知道,我是一个很菜的人);求H的距离很重要,这或许就是别人博客中说H重要,关系到算法好坏的一个点了。。。。。。

有了H,G就只需要记录就行了,走一步记一步,f主要是运用在选择上。

我的A*算法只能给刚开始学的人一个小小的理解,同时也是让我自己能更加理解这道题才写的这篇博客。。。。。

代码

#include <iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
using namespace std;
#define N 10005
typedef pair<int,int> P;
vector<P>vs[N],rvs[N];
int s,e,k,t;
int dist[N];//记录H
struct Node
{int v;//当前点int g;int f;bool operator <(const Node &a)const{return f>a.f;//用来比较F大小}
};
void dij(int e)//这个函数用来求H
{priority_queue<P, vector<P>, greater<P> >que;que.push(P(0,e));memset(dist,0x3f3f3f3f,sizeof(dist));dist[e]=0;while(que.size()){P t=que.top();que.pop();for(int it=0; it<(int)rvs[t.second].size(); it++){int v=rvs[t.second][it].first;int w=rvs[t.second][it].second;if(dist[v]>w+dist[t.second]){dist[v]=w+dist[t.second];que.push(P(dist[v],v));}}}
}int sove(int s)//这个函数用来判断怎么走
{priority_queue<Node>que;//用队列que.push((Node){s,0,0});int ans=0;while(que.size()){Node t=que.top();que.pop();if(t.v==e)ans++;//到终点的次数if(ans==k)return t.g;for(int i=0; i<(int)vs[t.v].size(); i++){int v=vs[t.v][i].first;int w=vs[t.v][i].second;Node p;p.v=v;p.g=t.g+w;//G的值p.f=p.g+dist[v];//F的值que.push(p);}}return 0;
}
int main()
{int n,m;while(scanf("%d %d",&n,&m)!=EOF){scanf("%d %d %d %d",&s,&e,&k,&t);for(int i=1; i<=n; i++)vs[i].clear(),rvs[i].clear();for(int i=1; i<=m; i++){int a,b,v;scanf("%d %d %d",&a,&b,&v);vs[a].push_back(P(b,v));rvs[b].push_back(P(a,v));}dij(e);if(dist[s]==0x3f3f3f3f)//如果没有通路{cout<<"Whitesnake!\n";continue;}int sum=sove(s);if(sum>t)//时间是否在t内{cout<<"Whitesnake!\n";}else{cout<<"yareyaredawa\n";}}return 0;
}

 

这篇关于Made In Heaven(A*算法初步学习)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]