刚学A*,实在找不出错哪了
顺便问一下优先队列用pair和重载运算符的区别
代码如下:
#include<bits/stdc++.h>
using namespace std;
int now,x,y,z,s,t,n,m,head[29131],Cnt,cnt,tot;
double val,dis[10231],X[12311],Y[13131],ff;
bool vis[10131],f;
struct node{
int next,to;
double w;
}e[1023131];
double JL(int x,int y) {
return sqrt((X[x]-X[y])*(X[x]-X[y])+(Y[x]-Y[y])*(Y[x]-Y[y]));
}
void add(int u,int v,double w){
e[++cnt].next=head[u];
e[cnt].to=v;
e[cnt].w=w;
head[u]=cnt;
}
void dj(){
priority_queue<pair<double,int>,vector<pair<double,int> >,greater<pair<double,int> > >q;
for (int i=1;i<=n;++i) dis[i]=9999999.9999;
memset(vis,0,sizeof(vis));
dis[t]=0; q.push(make_pair(0.000,t));
while(!q.empty()){
now=q.top().second; q.pop();
if (vis[now]) continue;
vis[now]=1;
for (int i=head[now];i;i=e[i].next) {
if (dis[e[i].to]>dis[now]+e[i].w) {
dis[e[i].to]=dis[now]+e[i].w;
q.push(make_pair(dis[e[i].to],e[i].to));
}
}
}
}
void A_star() {
memset(vis,0,sizeof(vis));
priority_queue<pair<double,pair<double,int> >,vector<pair<double,pair<double,int> > >,greater<pair<double,pair<double,int> > > >q;
q.push(make_pair(dis[s],make_pair(0,s)));
while(!q.empty()) {
now=q.top().second.second;
val=q.top().second.first;
q.pop();
if (now==t) {
++tot;
if (tot==2) {
printf("%.2lf",val);
f=1;
return ;
}
continue;
}
for (int i=head[now];i;i=e[i].next) {
q.push(make_pair(e[i].w+dis[e[i].to]+val,make_pair(e[i].w+val,e[i].to)));
}
}
}
signed main(){
cin>>n>>m;
s=1,t=n;
for (int i=1;i<=n;++i) {
cin>>X[i]>>Y[i];
}
for (int i=1;i<=m;++i) {
cin>>x>>y;
ff=JL(x,y);
add(x,y,ff);
add(y,x,ff);
}
dj();
A_star();
if (!f) {
cout<<-1;
}
return 0;
}