或许是直径求错,求直径的思路类似于树的直径两次搜索,dij预处理出每个点能到达的最远点以及其距离.但不知哪里出锅了.
ball ball 救救
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double dl;
typedef unsigned long long ull;
#define mod 100003
#define R register
#define next lglGLgLG
#define chkmin(x, y) (x=min(x, y))
#define chkmax(x, y) (x=max(x, y))
#define debug puts("lg")
const ll N=151;
/*
先预处理出每个点所能到达最远的点,以及最远的距离
*/
ll posx[N], posy[N];
inline dl calc(ll x, ll y) {
return sqrt(1.0*(posx[x]-posx[y])*(posx[x]-posx[y])+1.0*(posy[x]-posy[y])*(posy[x]-posy[y]));
}
char s[N][N];
ll n;
dl dis[N], f[N], Dis[N][N], g[N];
priority_queue<pair<dl, ll> >q;
bool book[N];
inline void dijkstra(ll S) {
for (int i=1; i<=n; i++) dis[i]=1e10;
memset(book, false, sizeof book);
dis[S]=.0;
q.push(make_pair(0, S));
while (q.size()) {
ll x=q.top().second; q.pop();
if (book[x]) continue;
book[x]=true;
for (int i=1; i<=n; i++) {
if (s[x][i]=='0') continue;
if (dis[i]>dis[x]+Dis[x][i]) {
dis[i]=dis[x]+Dis[x][i];
q.push(make_pair(-dis[i], i));
}
}
}
int mx=0;
dis[0]=-1;
for (int i=1; i<=n; i++) {
if (dis[i]==1e10) continue;
if (dis[i]>dis[mx]) mx=i;
}
f[S]=dis[mx];
}
int fa[N];
inline int getf(int x) {
return fa[x]==x? x: fa[x]=getf(fa[x]);
}
int main() {
scanf("%lld", &n);
for (int i=1; i<=n; i++) {
scanf("%lld %lld", &posx[i], &posy[i]);
}
for (int i=1; i<=n; i++) scanf("%s", s[i]+1);
for (int i=1; i<=n; i++) fa[i]=i;
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
if (s[i][j]=='1') {
Dis[i][j]=calc(i, j);
if (getf(i)!=getf(j)) fa[getf(i)]=getf(j);
}
}
}
for (int i=1; i<=n; i++) dijkstra(i);
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
if (getf(i)==getf(j)) chkmax(g[i], f[j]);
}
}
dl res=1e10;
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
if (getf(i)==getf(j)) continue;
chkmin(res, max(max(g[i], g[j]), f[i]+f[j]+calc(i, j)));
}
}
printf("%.6lf\n", res);
}