USACO:PROB Cow Tours

/*
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\n",an);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值