USACO:PROB Cow Tours

1971 ワード

/*
ID: Jang Lawrence
PROG: cowtour
LANG: C++
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#define X first
#define Y second
#define sqr(a) ((a)*(a))
using namespace std;
typedef long long lng;
int n;
typedef pair<int,int> pii;
pii a[200];
double s_dis(int x,int y)
{
    return sqrt((double)sqr(a[x].X-a[y].X)+(double)sqr(a[x].Y-a[y].Y));
}
double dis[151][151];
bool is[151][151];
double d[151][151];
double dm[151];
double ans[151];
int  h[151];
int main()
{
  #ifndef  DEBUG
  freopen("cowtour.in","r",stdin);
  freopen("cowtour.out","w",stdout);
  #endif
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d %d",&a[i].X,&a[i].Y);
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
dis[i][j]=dis[j][i]=s_dis(i,j);
for(int i=0;i<n;++i)
{
    getchar();
    for(int j=0;j<n;++j)
    is[i][j]=('1'==getchar());
}
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
if(is[i][j]==0)d[i][j]=d[j][i]=1e300;
else d[i][j]=d[j][i]=dis[i][j];
for(int k=0;k<n;++k)
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
if(d[i][k]+d[k][j]<d[i][j]) d[i][j]=d[i][k]+d[k][j];
for(int i=0;i<n;++i)
{dm[i]=-1.0;
    for(int j=0;j<n;++j)
    if(d[i][j]!=1e300)dm[i]=(dm[i]<d[i][j])?d[i][j]:dm[i];
}
memset(h,-1,sizeof(h));
for(int i=0;i<n;++i)
if(h[i]==-1){
    h[i]=i;
         for(int j=0;j<n;++j)
    if(d[i][j]!=1e300)
    {
        h[j]=i;
    }
}
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
if(d[i][j]!=1e300&&ans[h[i]]<d[i][j])ans[h[i]]=d[i][j];
double an=1e300;
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
if(d[i][j]==1e300)
{

    double anx=(ans[h[i]]>ans[h[j]])?ans[h[i]]:ans[h[j]];
    anx=(anx>dis[i][j]+dm[i]+dm[j])?anx:dis[i][j]+dm[i]+dm[j];
    an=(an>anx)?anx:an;
}
printf("%.6f
",an); return 0; }