社区讨论

求助,不是A*

P1491集合位置参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi7yvb7e
此快照首次捕获于
2025/11/21 05:52
4 个月前
此快照最后确认于
2025/11/21 05:52
4 个月前
查看原帖
跑了两遍SPFA,然后暴力跳
#3和#6死活过不去,呕
CPP
#include<bits/stdc++.h>
using namespace std;
int N,M,x[205],y[205],size,head[205],pre[205],vis[205];
double dis1[205],dis2[205];
double calc(int i,int j){
	return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
struct node{
	int nxt,to;double dis;
}edge[40005];
void adde(int from,int to){
	size++;
	edge[size].dis=calc(from,to);
	edge[size].nxt=head[from];
	edge[size].to=to;
	head[from]=size;
}
int main(){
	freopen("in.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin>>N>>M;
	for(int i=1;i<=N;i++)
	cin>>x[i]>>y[i];
	for(int i=1,u,v;i<=M;i++){
		cin>>u>>v;
		adde(u,v);
		adde(v,u);
	}
	memset(dis1,0x7f,sizeof(dis1));
	memset(dis2,0x7f,sizeof(dis2));
	dis1[1]=dis2[N]=0;
	queue<int>q;q.push(1);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].to;
			if(dis1[v]>dis1[u]+edge[i].dis){
				dis1[v]=dis1[u]+edge[i].dis;
				pre[v]=u;
				q.push(v);
			}
		}
	}
	int x=N;
	while(x){
		vis[x]=1;
		x=pre[x];
	} 
	q.push(N);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].to;
			if(dis2[v]>dis2[u]+edge[i].dis){
				dis2[v]=dis2[u]+edge[i].dis;
				q.push(v);
			}
		}
	}
	vector<double>G;
	for(int i=1;i<=N;i++)
	if(!vis[i])
	G.push_back(dis1[i]+dis2[i]);
	sort(G.begin(),G.end());
	printf("%.2lf",G[0]);
	return 0;
} 

回复

0 条回复,欢迎继续交流。

正在加载回复...