A*求助,#4MLE #6WA
查看原帖
A*求助,#4MLE #6WA
696967
int_Hello_world楼主2023/3/25 22:13

刚学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;
}
2023/3/25 22:13
加载中...