例题:骑马修栅栏
#include <bits/stdc++.h>
using namespace std;
int n,m,u,v,s,t;
double a[105][105],x[105],y[105];
int main()
{
memset(a,0x7f,sizeof(a));
cin >> n;
for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
cin >> m;
for (int i = 1; i <= m; i++)
{
cin >> u >> v;
a[u][v] = sqrt(abs(x[u]-x[v])*abs(x[u]-x[v])+abs(y[u]-y[v])*abs(y[u]-y[v]));
a[v][u] = a[u][v];
}
cin >> s >> t;
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (a[i][j] > a[i][k] + a[k][j]) a[i][j] = a[i][k] + a[k][j];
}
}
}
cout << fixed << setprecision(2) << a[s][t] << endl;
return 0;
}