原文链接:https://www.luogu.com.cn/problem/P1907
AC代码:
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<iomanip>
#include<algorithm>
using namespace std;
double a,b,sx,sy,ex,ey,sum=0,inf=1e10;
int n;
int mapp[1005][1005];
double lowc[1005];
typedef struct node{
double x;double y;
}node;
node nod,nodd;
vector<node> vec;
vector<int> que;
int isqueue[1005];
double calc(double x1,double y1,double x2,double y2){
double dis=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
dis=sqrt(dis);
return dis;
}
void spfa(){
int i,j;
for(i=0;i<1005;i++){
lowc[i]=inf;
}
que.push_back(0);lowc[0]=0;
isqueue[0]=1;
while(que.size()!=0){
int k=que[0];que.erase(que.begin());
isqueue[k]=0;
for(i=0;i<vec.size();i++){
if(k!=i){
double dis=calc(vec[k].x,vec[k].y,vec[i].x,vec[i].y);
if(lowc[i]>lowc[k]+dis*mapp[k][i]){
lowc[i]=lowc[k]+dis*mapp[k][i];
if(isqueue[i]==0){
que.push_back(i);
isqueue[i]=1;
}
}
}
}
}
}
int main(){
int i,j;
cin>>a>>b;
cin>>n;
for(i=0;i<1005;i++){
for(j=0;j<1005;j++){
mapp[i][j]=a;
}
}
vec.push_back(nod);
for(i=0;i<n;i++){
cin>>nod.x>>nod.y;
vec.push_back(nod);
}
while(cin>>i>>j){
if(i==0&&j==0) break;
mapp[i][j]=b;mapp[j][i]=b;
}
cin>>sx>>sy;
vec[0].x=sx;vec[0].y=sy;
cin>>ex>>ey;
nod.x=ex;nod.y=ey;
vec.push_back(nod);
spfa();
cout<<setiosflags(ios::fixed)<<setprecision(4);
cout<<lowc[vec.size()-1]<<endl;
return 0;
}