【题意】
往河中添加一块石头,使得最短路上最大距离最小
【思路】
枚举两个端点,那么某条路的最短路径上的最大距离就是max(dis1[i],dis2[j],dis[i][j]),建立两个虚源模仿最小生成树的做法,求dis1,dis2
【代码】:
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
const int maxn = 1e3 + 6;
const int inf = 0x3f3f3f3f;
double g[maxn][maxn];
double px[maxn], py[maxn];
double dis1[maxn];
double dis2[maxn];
int vis[maxn];
double w;
int n;
double dis(int i, int j) {
return sqrt((px[i]-px[j])*(px[i]-px[j]) + (py[i]-py[j])*(py[i]-py[j]));
}
void krucial1() {
for (int i = 1; i <= n; i++) {
dis1[i] = px[i];
}
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++) {
double mi = 1e18;
int dex = 0;
for (int j = 1; j <= n; j++) {
if (!vis[j] && dis1[j] < mi) {
dex = j;
mi = dis1[j];
}
}
if (!dex)break;
vis[dex] = 1;
for (int j = 1; j <= n; j++) {
if (!vis[j]&&dis1[j]>max(mi,g[dex][j]))
dis1[j] = max(mi, g[dex][j]);
}
}
}
void krucial2() {
for (int i = 1; i <= n; i++) {
dis2[i] = (w - px[i]);
}
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++) {
double mi = 1e18;
int dex = 0;
for (int j = 1; j <= n; j++) {
if (!vis[j] && mi > dis2[j]) {
mi = dis2[j];
dex = j;
}
}
if (!dex) { break; }
vis[dex] = 1;
for (int j = 1; j <= n; j++) {
if (!vis[j]&&dis2[j]>max(mi,g[dex][j])) {
dis2[j] = max(mi, g[dex][j]);
}
}
}
}
int main() {
freopen("froggy.in","r",stdin);
freopen("froggy.out","w",stdout);
scanf("%lf%d", &w, &n);
for (int i = 1; i <= n; i++) {
scanf("%lf%lf", &px[i], &py[i]);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <i; j++) {
g[i][j] = g[j][i] = dis(i, j);
}
}
krucial1();
krucial2();
double ans = 1e18;
double ansx = w/2.0;
double ansy = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i != j) {
double tmp = max(dis1[i], max(dis2[j], g[i][j] / 2));
if (tmp < ans) {
ans = tmp;
ansx = (px[i] + px[j]) / 2.0;
ansy = (py[i] + py[j]) / 2.0;
}
}
}
}
for (int i = 1; i <= n; i++) {
double tmp = max(px[i] / 2.0, 1.0*dis2[i]);
if (ans > tmp) {
ans = tmp;
ansx = px[i] / 2.0;
ansy = py[i] * 1.0;
}
tmp = max(1.0*dis1[i], (w - px[i]) / 2.0);
if (ans > tmp) {
ans = tmp;
ansx = (px[i]+w) / 2.0;
ansy = py[i] * 1.0;
}
}
printf("%.3f %.3f\n", ansx, ansy);
}