真正的spfa
见 P1744 采购特价商品
#include <bits/stdc++.h>
#define inf 1001
using namespace std;
queue <int> q;
double d[inf],w[inf][inf];
bool f[inf];
struct{
int x;
int y;
}b[inf];
int n,m,xx,yy,yd,gl;
void spfa(){
while(!q.empty()){
int now=q.front();
q.pop();
f[now]=0;
for(int i=1;i<=n;i++){
if(d[now]+w[now][i]<d[i]){
d[i]=d[now]+w[now][i];
if(f[i]==0){
q.push(i);
f[i]=1;
}
}
}
}
}
int main(){
cin>>n;
memset(w,0x7f,sizeof(w));
for(int i=1;i<=n;i++){
cin>>b[i].x>>b[i].y;
}
memset(d,0x7f,sizeof(d));
cin>>m;
for(int i=1;i<=m;i++){
cin>>xx>>yy;
w[xx][yy]=w[yy][xx]=sqrt(pow(double(b[yy].x-b[xx].x),2)+pow((double(b[yy].y-b[xx].y)),2));//这里只写了一个联通把我卡了半个小时(我才不会说我太弱了)
}
cin>>yd>>gl;
d[yd]=0;
q.push(yd);
spfa();
printf("%.2lf",d[gl]);
return 0;
}
原绿色洒满天际