样例不过,求调
查看原帖
样例不过,求调
1262406
yhy2024楼主2024/9/25 13:29
#include<bits/stdc++.h>
using namespace std;
char s[165];
int n,f[165];
double dis[165][165],maz[165],ans=INT_MAX;
struct e{
	double x,y;
}E[165];
double d(e x,e y){
	return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
int find(int x){
	if(f[x]==x){
		return x;
	}
	f[x]=find(f[x]);
	return f[x];
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		f[i]=i;
		for(int j=1;j<=n;j++){
			dis[i][j]=INT_MAX;
		}
	}
	for(int i=1;i<=n;i++){
		cin>>E[i].x>>E[i].y;
	}
	for(int i=1;i<=n;i++){
		scanf("%s",s+1);
		for(int j=1;j<=n;j++){
			if(s[j]=='1'){
				f[find(i)]=find(j);
				dis[j][i]=dis[i][j]=d(E[i],E[j]); 
			//	cout<<i<<" "<<j<<endl;
			}
			if(i==j){
				dis[i][j]=0; 
			}
		}
	}
	//cout<<dis[6][8];
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(i!=j){
					dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
				//	cout<<i<<" "<<j<<" "<<d(E[i],E[j])<<endl;
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(find(i)==find(j)&&i!=j){
				maz[find(i)]=max(dis[i][j],maz[find(i)]);
			//	printf("%.6lf %d %d %d %.6lf\n",maz[find(i)],find(i),i,j,dis[i][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			int f1=find(i),f2=find(j);
			if(f2!=f1){
				ans=min(ans,maz[5]+maz[8]+d(E[i],E[j]));
			}
		}
	} 
	printf("%.6lf",ans);
	return 0; 
} 
2024/9/25 13:29
加载中...