#7Wa 求助
查看原帖
#7Wa 求助
220285
Saber_Master楼主2022/11/15 07:21

或许是直径求错,求直径的思路类似于树的直径两次搜索,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);
}
2022/11/15 07:21
加载中...