90pts求条(玄关
查看原帖
90pts求条(玄关
655089
wch2021楼主2024/10/30 10:24

7# WA

#include "bits/stdc++.h"
using namespace std;
const int N=155;
int n,x[N],y[N],a[N][N],h[N],ec,col[N];
double dis[N],ans=1e9;
bool vis[N];
struct node{int nxt,to;double w;}e[N*N<<1];
inline void add(int u,int v,double w){e[++ec].to=v;e[ec].w=w;e[ec].nxt=h[u];h[u]=ec;}
string s;
inline double squ(int l,int r){return sqrt((x[l]-x[r])*(x[l]-x[r])+(y[l]-y[r])*(y[l]-y[r]));}
void SPFA(int start,int c){
	for(int i=1;i<=n;++i)dis[i]=1e9;
	memset(vis,0,sizeof(vis));
	queue<int>q;q.push(start);
	vis[start]=1;dis[start]=0;
	if(c!=-1)col[start]=c;
	while(!q.empty()){
		int u=q.front();q.pop();
		vis[u]=0;
		for(int i=h[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(a[u][v]==0)continue;
			double w=e[i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				if(c!=-1)col[v]=c;
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
}
int main(){
	freopen("P1522_7.in","r",stdin);
//	freopen("P1522_7.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i)cin>>x[i]>>y[i];
//	if(n==150&&x[1]==6766&&y[1]==7898)
//	{
//		printf("39796.392691");
//		return 0;
//	}
	for(int i=1;i<=n;++i){
		cin>>s;
		for(int j=0;j<n;++j)
			a[i][j+1]=s[j]-'0';
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(a[i][j]){
				add(i,j,squ(i,j));
				add(j,i,squ(i,j));
			}
	for(int i=1,j=0;i<=n;++i)
		if(!col[i])SPFA(i,++j);
	for(int i=1;i<=n;++i){
		for(int j=i+1;j<=n;++j){
			if(col[i]==col[j])continue;
			add(i,j,squ(i,j));
			add(j,i,squ(i,j));
			a[i][j]=a[j][i]=1;
			SPFA(i,-1);
			double maxn=-1e9;
			int rt;
			for(int k=1;k<=n;++k){
				if(dis[k]<1e9&&maxn<dis[k]){
					maxn=dis[k];
					rt=k;
				}
			}
			SPFA(rt,-1);
//			printf("%d\n",rt);for(int k=1;k<=n;++k)printf("%.6lf ",dis[k]);puts("");
			maxn=-1e9;
			for(int k=1;k<=n;++k)if(dis[k]<1e9)maxn=max(maxn,dis[k]);
			ans=min(ans,maxn);
			a[i][j]=a[j][i]=0;
		}
	}
	printf("%.6lf",ans);
	return 0;
}
2024/10/30 10:24
加载中...