题目链接:http://192.168.167.168/JudgeOnline/problem.php?cid=1010&pid=0
解题思路:n来标记节点,方便记录路径
#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
bool M[1100];
int Xi[1100],Yi[1100],Ri[1100];
double D[1100];
int P[1100];
int n,xi,yi,ans,ansnum=0;
void bfs()
{
for(int i=1;i<=n;i++)
{
M[i]=true;
}
queue<int> Q;
Q.push(1);
M[1]=false;
D[1]=10000;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int v=1;v<=n;v++)
if(M[v]&&Ri[u]+Ri[v]==sqrt(double((Xi[u]-Xi[v])*(Xi[u]-Xi[v])+(Yi[u]-Yi[v])*(Yi[u]-Yi[v]))))
{
Q.push(v);
D[v]=D[u]*Ri[u]/Ri[v];
M[v]=false;
P[v]=u;
if(Xi[v]==xi&&Yi[v]==yi)
{
ans=v;return;
}
}
}
}
int print_path(int v)
{
if(v==1)
return 10000;
else
return print_path(P[v])+D[v];
}
int main()
{
cin>>n>>xi>>yi;
for(int i=1;i<=n;i++)
{
cin>>Xi[i]>>Yi[i]>>Ri[i];
}
bfs();
cout<<print_path(ans);
return 0;
}