宽度优先搜索

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值