题解 P2903 【[USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler】
这个题数据范围N<=1050 , O(N²)的BFS,每次逐个计算两个齿轮的距离 ,实现过程很容易。
具体细节见代码注释。
P.S. 齿轮转的方向和结果好像没什么关系,于是我算的时候就没取相反数。
//Bzoj1615 麻烦的干草打包机
#include<bits/stdc++.h>
#define MAXN 1084
struct cycle{
int x,y,r;
}a[MAXN];
using namespace std;
int N,xt,yt,st,ed,p[MAXN];
double s[MAXN],ans;
bool vis[MAXN];
void BFS()
{
queue<int>q;
vis[st]=1,s[st]=10000; //初值
q.push(st);
while(!q.empty())
{
int tmp=q.front();q.pop();
for(int i=1;i<=N;i++)
{
if(vis[i])continue;
if((a[tmp].x-a[i].x)*(a[tmp].x-a[i].x)+(a[tmp].y-a[i].y)*(a[tmp].y-a[i].y)==(a[i].r+a[tmp].r)*(a[i].r+a[tmp].r))
{ //上面这行是判断 距离的平方 是否等于 两齿轮半径和的平方
vis[i]=1;
double t=a[tmp].r*1.0/a[i].r; //计算
s[i]=s[tmp]*t;
p[i]=tmp; //这里说一下这个p数组是记路径用的,方便加和。
if(i==ed)return ; //跳出
q.push(i);
}
}
}
}
int main()
{
scanf("%d%d%d",&N,&xt,&yt);
for(int i=1;i<=N;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].r);
if(a[i].x==0&&a[i].y==0)st=i;
if(a[i].x==xt&&a[i].y==yt)ed=i; //存一下开始和结尾的位置
}
BFS();
for(int i=ed;i;i=p[i])
ans+=s[i];
printf("%d",(int)ans); //这个地方要取整,四舍五入会WA30
return 0;
}
博客链接http://www.cnblogs.com/Elfish/p/7634159.html