记录编号 127354 评测结果 AAAAAA
题目名称 [USACO 2.4.3]牛的旅行 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2014-10-15 15:51:20 内存使用 0.93 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
queue<int> A;
char s[160];
int zuox[151]={0},zuoy[151]={0},n,m,lian[151][151]={0},jihe[151][151]={0},to[151][151]={0},jiheshu,i,p,j,k,zj1;
bool pan[151]={0};
long long zj2,zj3;
double zui=1e10,qwq,street[151][151]={0},zhi[151][151]={0},ENDzhi[151]={0};
void init()
{
	scanf("%d",&n);
	for(i=1;i<=n;i++) scanf("%d%d",&zuoy[i],&zuox[i]);
	for(i=1;i<=n;i++)
	{
		scanf("%s",s+1);
		for(p=1;p<=n;p++)
		if(s[p]!='0')
		{
			lian[i][0]++;
			lian[i][ lian[i][0] ]=p;
			to[i][0]++;
			to[i][ to[i][0] ]=p;
			zj2=zuox[i]-zuox[p];zj2*=zj2;
			zj3=zuoy[i]-zuoy[p];zj3*=zj3;
			zj2+=zj3;
			qwq=sqrt((double)zj2);
			street[i][p]=qwq;
		}
	}
}
void bfs_set()
{
	for(i=1;i<=n;i++)
	if(!pan[i])
	{
		pan[i]=true;
		jiheshu++;
		jihe[jiheshu][0]=1;
		jihe[jiheshu][1]=i;
		A.push(i);
		while(!A.empty())
		{
			zj1=A.front();A.pop();
			for(p=1;p<=lian[zj1][0];p++)
			if(!pan[ lian[zj1][p] ])
			{
				pan[ lian[zj1][p] ]=true;
				jihe[jiheshu][0]++;
				jihe[jiheshu][ jihe[jiheshu][0] ]=lian[zj1][p];
				A.push(lian[zj1][p]);
			}
		}
	}
}
void Set_SPFA()
{
	for(i=1;i<=jiheshu;i++)
	for(p=1;p<=jihe[i][0];p++)
	{
		for(j=1;j<=jihe[i][0];j++)
		zhi[ jihe[i][p] ][ jihe[i][j] ]=1e10;
		zhi[ jihe[i][p] ][ jihe[i][p] ]=0;
	}
	for(i=1;i<=jiheshu;i++)
	for(p=1;p<=jihe[i][0];p++)
	{
		zj1=jihe[i][p];
		for(j=1;j<=to[zj1][0];j++)
		{
			A.push(to[zj1][j]);
			zhi[zj1][ to[zj1][j] ]=street[zj1][ to[zj1][j] ];
		}
		while(!A.empty())
		{
			k=A.front();A.pop();
			for(j=1;j<=to[k][0];j++)
			if(zhi[zj1][ to[k][j] ]>zhi[zj1][k]+street[k][ to[k][j] ])
			{
				zhi[zj1][ to[k][j] ]=zhi[zj1][k]+street[k][ to[k][j] ];
				A.push(to[k][j]);
			}
		}
		for(j=1;j<=jihe[i][0];j++)
		if(zhi[zj1][ jihe[i][j] ]>ENDzhi[zj1])
		ENDzhi[zj1]=zhi[zj1][ jihe[i][j] ];
	}
}
void End_find()
{
	for(i=1;i<=jiheshu;i++)
	for(p=i+1;p<=jiheshu;p++)
	for(j=1;j<=jihe[i][0];j++)
	for(k=1;k<=jihe[p][0];k++)
	{
		zj2=zuox[ jihe[i][j] ]-zuox[ jihe[p][k] ];zj2*=zj2;
		zj3=zuoy[ jihe[i][j] ]-zuoy[ jihe[p][k] ];zj3*=zj3;
		zj2+=zj3; qwq=sqrt((double)zj2);
		qwq+=ENDzhi[ jihe[i][j] ]+ENDzhi[ jihe[p][k] ];
		if(qwq<zui) zui=qwq;
	}
}
int main()
{
	freopen("cowtour.in","r",stdin);
	freopen("cowtour.out","w",stdout);
	init();
	bfs_set();
	Set_SPFA();
	End_find();
	printf("%.6lf\n",zui);
	return 0;
}