9命()bfs做法实在调不出来了QAQ
  • 板块P1433 吃奶酪
  • 楼主CLCK
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/10/27 08:50
  • 上次更新2023/10/27 05:41:07
查看原帖
9命()bfs做法实在调不出来了QAQ
323183
CLCK楼主2022/10/27 08:50

如题

求助大佬帮忙看看(

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;
}
2022/10/27 08:50
加载中...