如题
求助大佬帮忙看看(
bfs应该可以做吧
应该就是考虑下一个搜索点的部分出了问题
#include <iostream>
#include <cmath>
#include <queue>
using namespace std;
int n;
double ans = -1;
double finans = 0x3f3f3f3f;
double ret[20];
struct cheese {
int x, y;
int num;
} c[20];
bool vis[20];
double dis(int a, int b) {
return sqrt((long long)(c[a].x - c[b].x) * (c[a].x - c[b].x) +
(long long)(c[a].y - c[b].y) * (c[a].y - c[b].y));
}
bool check() {
for (int i = 1; i <= n; i++) {
if (ret[i] == 0 || vis[i] == 0) return false;
}
return true;
}
void bfs(cheese t) {
queue<cheese> q;
q.push(t);
vis[t.num] = true;
while (!q.empty() || !check()) {
cheese pp = q.front();
// cout << pp.x << " " << pp.y << " " << pp.num << endl;
q.pop();
if (q.empty()) ans = ret[pp.num];
for (int i = 1; i <= n; i++) {
cheese p = pp;
// if (vis[i]) continue;
if (ret[p.num] >= ret[i] && vis[i] && ret[i] != 0) continue;
if (i == p.num) continue;
ret[i] = ret[p.num] + dis(i, p.num);
if (p.num != 0) vis[i] = true;
q.push(c[i]);
// cout << check() << endl;
}
}
// for (int i = 1; i < n; i++) {
// cout << ret[i] << endl;
// }
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> c[i].x >> c[i].y;
c[i].num = i;
// cout << dis(i, i - 1) << endl;
}
// bfs(cheese{0, 0, 0});
for (int i = 1; i <= n; i++) {
memset(vis, 0, sizeof(vis));
memset(ret, 0, sizeof(ret));
ans = -1; bfs(c[i]);
finans = min(finans, ans + dis(0, i));
}
printf("%.2f", ans);
return 0;
}