上代码
#include<iostream>
#include<cmath>
using namespace std;
int n, m, sta, dst; const int maxn = 1 << 30;
int con[101][101]; //con[u][x]为与u连通的第n个点
float dis[101][101];
int px[101], py[101], vis[101]; //vis用于判断该点是否在solve的栈中
float val[101]; //px py val 分别为点的横 纵坐标 到目标的距离
void add(int a, int b) { //添加边
int dx = px[a] - px[b], dy = py[a] - py[b];
float s = sqrt(dx * dx + dy * dy);
con[a][++con[a][0]] = b;
con[b][++con[b][0]] = a;
dis[a][b] = dis[b][a] = s;
return;
}
void read() {
cin >> n;
for (int i = 1; i <= n; i++)cin >> px[i] >> py[i];
cin >> m; int a, b;
for (int i = 0; i < m; i++) {
cin >> a >> b;
add(a, b);
}
cin >> sta >> dst; val[dst] = 1; //val[x]==0被用于判断点未被计算出结果,这里把目标加一,输出时再减一
return;
}
float solve(int x) {
if (val[x])return val[x];
vis[x] = 1;
float min = maxn, now; int p;
for (int i = con[x][0]; i > 0; i--) { //找到离目标最近的点
p = con[x][i];
if ((!val[p]) && vis[p])continue; //防止循环
now = dis[x][p] + solve(p);
if (now < min)min = now;
}
if (min != maxn)val[x] = min; //避免一个点因周围点在栈中导致被判不在与目标最短路上
vis[x] = 0;
return min;
}
void pt(int x) { //调试用函数,打印到x的点及距离
int p; cout << endl;
for (int i = con[x][0]; i >= 0; i--) {
p = con[x][i];
cout << p << " #" << i << ' ' << dis[x][p] << "$ ";
}
return;
}
int main() {
read();
printf("%.2lf", solve(sta) - 1);
return 0;
}
个人推测是路径有误(测试点1输出为九万多,无规律)
还望路过的大佬不吝赐教,不胜感激