一个裸的Floyd算法就行,其核心是遍历,找出通过每个中继点的最短路径。
。。其实这道题先输入了两个顶点数,直接单源Dijkstra就行
#include <iostream>
#include <cstring>
#include <cmath>
#include <iomanip>
#define INF 10000000
using namespace std;
struct node{
int x,y;
};
int main() {
node ding[200];
double a[200][200];
fill(a[0],a[0]+170*170,INF);
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>ding[i].x>>ding[i].y;
}
int m;
cin>>m;
for(int i=0;i<m;i++){
int b,c;
cin>>b>>c;
b=b-1;
c=c-1;
a[b][c]=sqrt((ding[b].x-ding[c].x)*(ding[b].x-ding[c].x)+(ding[b].y-ding[c].y)*(ding[b].y-ding[c].y));
a[c][b]=a[b][c];
}
int path[105][105];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
path[i][j]=j;
}
}
for(int k=0;k<n;k++){
for(int v=0;v<n;v++){
for(int w=0;w<n;w++){
if(a[v][w]>a[v][k]+a[k][w]){
a[v][w]=a[v][k]+a[k][w];
path[v][w]=path[v][k];
}
}
}
}
int b,c;
cin>>b>>c;
cout<<fixed;
cout<<setprecision(2);
cout<<a[b-1][c-1];
return 0;
}