求调70pts , WA8、9、10悬赏一关
查看原帖
求调70pts , WA8、9、10悬赏一关
1062532
MinLand楼主2023/12/24 14:10
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const double INF = 0x7ffffffffffff;
const ll N = 200;

ll read();
double calc(ll, ll);//返回两点间距离
void Read();
ll n;
double dis[N][N];
int x[N], y[N];
bool vis[N][N];
double m[N];
double r = INF;

inline void out() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (dis[i][j] == INF)
				printf("%d->%d:INF\n", i, j);
			else
				printf("%d->%d:%.6lf\n", i, j, dis[i][j]);
		}
	}
	return;
}

int main() {
	Read();
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				if (vis[k][j] && i != j)
					dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (dis[i][j] < INF - 1  && i != j) {
				m[i] = max(dis[i][j], m[i]);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (i != j && dis[i][j] > INF - 1) {
				r = min(r, calc(i, j) + m[i] + m[j]);
			}
		}
	}
	for (int i = 1; i <= n; i++)r = max(m[i], r);
//	printf("%.6lf\n", max(r1, r2));
	printf("%.6lf", r);
}

double calc(ll a, ll b) {
	return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}

void Read() {
	n = read();
	for (int i = 1; i <= n; i++) {
		x[i] = read(), y[i] = read();
	}
	string s;
	for (int i = 1; i <= n; i++) {
		cin >>  s ;
		s = '%' + s;
		for (int j = 1; j <= n; j++) {
			vis[i][j] = s[j] - '0';
			if (vis[i][j] == 1) {
				dis[i][j] = calc(i, j);
			} else
				dis[i][j] = INF;
		}
	}
}

ll read() {
	ll f = 1, x = 0;
	char c = getchar();
	while (!isdigit(c)) {
		if (c == '-')
			f = -1;
		c = getchar();
	}
	while (isdigit(c)) {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}

调了两个小时了TAT,不知问题是什么

2023/12/24 14:10
加载中...