1 solutions

  • 0
    @ 2024-12-10 23:09:38

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    
    using namespace std;
    
    double f[151][151],m[151],minx,r,temp,x[151],y[151],maxint=1e12;
    double dist(int i,int j)
    {
    	return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
    }
    
    int main()
    {
        int i,j,n,k;
    	char c;
    	
    	cin >> n;
    	for (i = 1; i <= n; i++)
    	{
    		cin >> x[i] >> y[i];
    	}   
    	for (i = 1; i <= n; i++)
    	 for (j = 1; j <= n; j++)
    	 {
    	 	cin >> c;
    	 	if(c=='1')
    	 	{
    	 		f[i][j]=dist(i,j);
    	 	}
    	 	else
    	 	{
    	 		f[i][j]=maxint;
    	 	}
    	 }
    	for(k = 1; k <= n; k++)
    		for(i = 1; i <= n; i++)
    			for(j = 1; j <= n; j++)
    				if(i!=j && i!=k && j!=k)
    					if(f[i][k]<maxint-1 && f[k][i]<maxint-1)
    						if(f[i][j]>f[i][k]+f[k][j])
    							f[i][j]=f[i][k]+f[k][j];
    	memset(m,0,sizeof(m));
    	for(i=1;i<=n;i++)
    	for(j=1;j<=n;j++)
    	if((f[i][j]<(maxint-1))&&(m[i]<f[i][j]))
    	m[i]=f[i][j];
    	minx=1e20;
    	for (i = 1; i <= n; i++)
    	 for (j = 1; j <= n; j++)
    	 	if(i!=j && f[i][j]>maxint-1)
    	 	{
    	 		temp=dist(i,j);
    	 		if(minx>m[i]+m[j]+temp)minx=m[i]+m[j]+temp;
    	 	}
    	r=0;
    	for (i = 1; i <= n; i++)
    		if(m[i]>minx)
    		minx=m[i];
    		printf("%0.6lf",minx);
        return 0;
    }
    
    • 1

    Information

    ID
    579
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By