萌新非常非常不解的疑惑
查看原帖
萌新非常非常不解的疑惑
120017
JeffZhao楼主2021/7/19 17:52
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cmath>

using namespace std;

const int N = 1e3 + 10;

int a[N], b[N], n;
double f[N][N], d[N], dis[N][N];

int main(void) {

	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin >> n;

	for (int i = 1; i <= n; ++i)
		cin >> a[i] >> b[i];

	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			dis[i][j] = sqrt((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]));

	string ch;

	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			f[i][j] = 1e8;

	for (int i = 1; i <= n; ++i)
		f[i][i] = 0.0;

	for (int i = 1; i <= n; ++i) {
		cin >> ch;

		for (int j = 0; j < ch.size(); ++j) {
			if (ch[j] == '1')f[i][j + 1] = dis[i][j + 1];
		}
	}

	for (int k = 1; k <= n; ++k)
		for (int i = 1; i <= n; ++i)
			for (int j = 1; j <= n; ++j)
				if (i != j && i != k && j != k && f[i][k] < 1e8 && f[k][j] < 1e8)
					f[i][j] = min(f[i][j], f[i][k] + f[k][j]);

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			if (f[i][j] != 1e8)
				d[i] = max(f[i][j], d[i]);
		}
	}

	double ans = 1e8;

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			if (i == j)continue;
			if (f[i][j] == 1e8) {
				ans = min(ans, dis[i][j] + d[i] + d[j]);
			}
		}
	}
	for (int i = 1; i <= n; ++i)
		ans = max(ans, d[i]);

	printf("%0.6lf", ans);

	return 0;
}

这样交上去第第七个点会WA

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			if (i == j)continue;
			if (f[i][j] == 2e9) {
				ans = min(ans, dis[i][j] + d[i] + d[j]);
			}
		}
		ans = max(ans, d[i]);
	}

但是如果把ans = max(ans , d[i])提到外面去就A了

for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			if (i == j)continue;
			if (f[i][j] == 1e8) {
				ans = min(ans, dis[i][j] + d[i] + d[j]);
			}
		}
	}
	for (int i = 1; i <= n; ++i)
		ans = max(ans, d[i]);
2021/7/19 17:52
加载中...