社区讨论
求助,不是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 条回复,欢迎继续交流。
正在加载回复...