[搜索-bitset]Moocast-S

题面

题目描述

Farmer John 有 N 头奶牛,他们想组建一个紧急的“传递信息”系统,以便相互之间传递重要的信息。
他们决定使用对讲机来作为装备,而不是通过相互间的哞哞叫,每头牛配有一只对讲机。这些对讲机都有自己的有限传输半径,如果有限传输半径是 P P P 的话,也就是说该对讲机能将信息传送到与之距离不超过 P P P 的对讲机(请注意,奶牛 A A A 可能把信息传递给奶牛 B B B,但奶牛 B B B 却可能没办法把信息传递回去,因为奶牛 A 的有限传输半径大于奶牛 B B B 的有限传输半径)。幸运的是,奶牛可以通过其他奶牛传递信息,所以没必要每头牛都能直接传送到其他牛。
由于对讲机的这种不对等的性质,其中的一些奶牛传播效果可能比其他奶牛更有效,因为它们能传递到更多的接收者(相互之间产生直接联系)。请帮助奶牛确定:如果源于一头牛,最多能将信息传递到多少头牛?

输入

第 1 行输入奶牛的个数 N N N
第 2 到 N + 1 N+1 N+1 行,第 i + 1 i+1 i+1 行代表第 i i i 头奶牛的 X i X_i Xi Y i Y_i Yi坐标,以及其对应对讲机的最大传输半径 P i P_i Pi

输出

输出共一行一个整数,源于一头牛,最多能将信息传递到多少头牛?原始的这头牛也包含在内。

搜索思路

  1. 根据坐标和 P i P_i Pi,作出一(或多)张有向图
  2. 由每个端点找到最多传递的点,求出最大的输出

b i t s e t bitset bitset使用

因为需要不跑重复点,且要统计到达点的个数用 b i t s e t bitset bitset就可以快速实现
bitset用法(fromArvid Y):bitset详解c++
对比一下用bitset和不用bitset的

bitsetbool
s.reset()memset(boo,0,sizeof(boo)
搜索搜索
if(ans<s.count())for(int i=1;i<=N;i++)x+=boo[i];
ans=s.conut()ans=max(ans,x);

完整代码

#include<bits/stdc++.h>
using namespace std;
int N,ans;
int f[239][239];
bitset<239>s(0);
struct Q{
	int x,y,v;
}a[239]; 
void dfs(int u){
	if(s[u]==1)return;
	s.set(u,1);
	for(int i=1;i<=N;i++){
		if(i!=u&&f[u][i]==1){
			dfs(i);
		}
	}
} 
int main() {
	freopen("1.in","r",stdin);
	scanf("%d",&N);
	for(int i=1; i<=N; i++) {
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
	}
	for(int i=1; i<=N; i++) {
		for(int j=1; j<=N; j++) {
			if((double)sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y))<a[i].v)f[i][j]=1;
		}
	}
	for(int i=1;i<=N;i++){
		s.reset();
		dfs(i);
		if(ans<s.count())ans=s.count(); 
	}
	printf("%d\n",ans);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值