USACO 2.4.3 Cow Tours (Floyd)

USACO 2.4.3 Cow Tours (Floyd)
先用floyd 求两点之间的最短距离map[i][j] ,再求各点与牧区内其他结点距离的最大值d[i]。

枚举分别在两个牧区的两个点i,j,

tmp =  d[i] + d[j] + ( i, j 之前的距离)

/**/ /*
ID: lorelei
TASK: cowtour
LANG: C++
*/


#include 
< fstream >
#include 
< cmath >
#include 
< iomanip >
#include 
< iostream >
#include 
< memory.h >

using   namespace  std;

const   double  INF  =   999999.0 ;

typedef pair
< int int >  PAIR;
PAIR loc[
200 ];

double  map[ 200 ][ 200 ];
double  d[ 200 ];
int  N;

inline 
double  dist( int  x1,  int  y1,  int  x2,  int  y2) {
    
return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}


int  main() {
    
int i,j,k;
    
double ans= INF;

    ifstream fin(
"cowtour.in");
    ofstream fout(
"cowtour.out");

    fin
>>N;

    
for(i=0; i<N; ++i)
        fin
>>loc[i].first>>loc[i].second;

    
char ch;
    
for(i=0; i<N; ++i)
        
for(j=0; j<N; ++j){
            fin
>>ch;
            
if(ch=='1'
                map[i][j] 
= map[j][i] = dist(loc[i].first, loc[i].second, loc[j].first, loc[j].second);
            
else if(ch=='0'
                map[i][j] 
= map[i][j] = INF;
            
if(i==j) 
                map[i][j] 
= 0;

        }


    
for(k=0; k<N; ++k)
        
for(i=0; i<N; ++i)
            
for(j=0; j<N; ++j)
                
if(map[i][j] > map[i][k]+map[k][j])
                    map[i][j] 
= map[i][k]+map[k][j];

    memset(d, 
0sizeof(d));
    
for(i=0; i<N; ++i)
        
for(j=0; j<N; j++)
            
if(map[i][j]>d[i] && map[i][j]!=INF)
                d[i] 
= map[i][j];

    
for(i=0; i<N; ++i)
        
for(j=0; j<N; ++j)
            
if(map[i][j]==INF){
                
double tmp = d[i]+d[j]+dist(loc[i].first, loc[i].second, loc[j].first, loc[j].second);
                
if(tmp<ans)
                    ans 
= tmp;
            }


    
for(i=0; i<N; ++i)
        
if(d[i]>ans)
            ans 
= d[i];

    fout
<<setprecision(6)<<setiosflags(ios::fixed | ios::showpoint)<<ans<<endl;

    
return 0;
}

你可能感兴趣的:(USACO 2.4.3 Cow Tours (Floyd))