【问题描述】
每头牛手上有一台对讲机,给出N(1≤N≤200)头牛的坐标(X,Y)及其对讲机的最大传输半径P,也就是说该对讲 机能将信息传送到与之距离不超过P的对讲机。幸运的是,牛可以传递消息通过其他牛,所以没有必要每头牛能直接 传送到其他牛。 请帮助奶牛确定:如果从某一头牛开始用对讲机传输信息,最多能将信息传递到多少头牛(包括开始那只牛)?
【输入格式】(输入文件名: moocast.in)
输入第一行一个整数N
接下来N行,每行是三个整数x,y,P(整数范围:0…25,000),分别表示每只奶牛的坐标及其对讲机的最大传输半径。
【输出格式】(输出文件名:moocast.out)
输出只含有一行,表示从某头牛出发,最多可以将信息传给多少头牛?
输入样例
4
1 3 5
5 4 3
7 2 1
6 1 1
输出样例
3
数据范围
100%数据N<=100;
这道题废话不多说,直接上程序。(深度优先搜索)
#include<bits/stdc++.h>
using namespace std;
int n,t,ans,vis[201];
struct node
{
int x,y,w;
}a[201];
inline double js(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
inline void dfs(register int x)
{
register int i;
for(i=1;i<=n;i++)
if(js(a[x],a[i])<=a[x].w&&!vis[i])
{
vis[i]=1;
dfs(i);
}
}
int main()
{
freopen("moocast.in","r",stdin);
freopen("moocast.out","w",stdout);
scanf("%d",&n);
register int i,j;
for(i=1;i<=n;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
for(i=1;i<=n;i++)
{
t=0;
memset(vis,0,sizeof(vis));
vis[i]=1;
dfs(i);
for(j=1;j<=n;j++)
if(vis[j]) t++;
ans=max(ans,t);
}
printf("%d",ans);
return 0;
}