→题目链接←
一个水题....
找到从起点到终点的路径,然后算出所有的转速,最后加起来
因为一个齿轮不可能被两个齿轮驱动,所以从起点到终点一定只有一条路径
所以从起点开始,进行深搜就好,整个图像是一个树一样
存一下每个点的父亲节点,最后从终点向上一直找就是那条路经
注意:
1、转速进行运算时一定要用小数,有进位什么的
2、输出答案时不能直接printf("%0.lf",ans),这样是自动四舍五入的,要舍掉所有的小数
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<deque>
using namespace std;
struct node{
int x,y,r;
};
int n,xx,yy;
bool vis[1100];
node a[1100];
int par[1100];
int e,s;
double ans=0;
deque<int>q;
void dfs(int x){
vis[x]=true;
for(int i=1; i<=n; i++){
if(!vis[i] && (a[i].x-a[x].x)*(a[i].x-a[x].x)+(a[i].y-a[x].y)*(a[i].y-a[x].y)==(a[i].r+a[x].r)*(a[i].r+a[x].r)){
par[i]=x;
dfs(i);
}
}
}
int main(){
scanf("%d%d%d",&n,&xx,&yy);
for(int i=1; i<=n; i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].r);
if(a[i].x==xx && a[i].y==yy)e=i;
if(a[i].x==0 && a[i].y==0)s=i;
}
par[s]=0;
dfs(s);
int x=e;
while(x!=0){
q.push_front(x);
x=par[x];
}
int last=s;
double speed=10000;
while(!q.empty()){
x=q[0];
q.pop_front();
speed=speed*(a[last].r*1.0)/(a[x].r*1.0);
ans+=speed;
last=x;
}
printf("%d\n",(int)ans);
return 0;
}