1. 程式人生 > >真正的spfa

真正的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;
}