记录编号 79251 评测结果 AAAAAAAAAA
题目名称 [USACO Mar08] 麻烦的干草打包机 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.024 s
提交时间 2013-11-05 11:23:47 内存使用 0.34 MiB
显示代码纯文本
#include <fstream>
#include <deque>
#include <cmath>
using namespace std;
ifstream fi("baler.in");
ofstream fo("baler.out");
class T
{
public:
	int x,y,r,num;
};
T lun[1051];
int xt,yt,n,root,fu[1051],son;
bool f[1051];
double zs[1051];
deque <T> v;
void init()
{
	int i;
	fi>>n>>xt>>yt;
	for (i=1;i<=n;i++)
	{
		fi>>lun[i].x>>lun[i].y>>lun[i].r;
		lun[i].num=i;
	}
	for (i=1;i<=n;i++) {f[i]=true;zs[i]=0;}
	for (i=1;i<=n;i++)
	{
		if (lun[i].x==0&&lun[i].y==0) root=i;
		if (lun[i].x==xt&&lun[i].y==yt) son=i;
	}
	fu[root]=root;zs[root]=double(10000);
}
void bfs()
{
	int p,i;
	double lpr,lir,a2,b2;
	f[root]=false;
	v.push_back(lun[root]);
	while (v.size()!=0)
	{
		p=v[0].num;
		v.pop_front();
		for (i=1;i<=n;i++)
			if (f[i])
			{
				lpr=double(lun[p].r);lir=double(lun[i].r);
				a2=double(abs(lun[p].x-lun[i].x))*double(abs(lun[p].x-lun[i].x));
				b2=double(abs(lun[p].y-lun[i].y))*double(abs(lun[p].y-lun[i].y));
				if (abs(lpr+lir-sqrt(a2+b2))<0.00001)
				{
					f[i]=false;fu[i]=p;
					zs[i]=zs[p]*double(double(lun[p].r)/double(lun[i].r));
					v.push_back(lun[i]);
				}
			}
	}
}
int suan()
{
	int p=son;
	double ans=double(0);
	while (fu[p]!=p)
	{
		ans+=zs[p];
		p=fu[p];
	}
	return ans+10000;
}
int main()
{
	init();
	bfs();
	fo<<suan()<<endl;
	return 0;
}