CodeForces 986C AND Graph (逻辑运算+思维+DFS)

题目链接

题意:第一行给出一个n和m,随后一行是m个数据,数据范围是0~(1<

分析:首先我们要分析一下,对于一个数X可以连接的点有什么,因为是进行逻辑&运算,因此对于一个数在(1<

题解:那么我们要考虑的是如何更快的而且可以准确的dfs一个点将与他相连接的点全部标记呢,有点像贪心吧,我们可以选择给出的m个数从小到大来dfs,每次dfs将这个集合中的所有点标记起来,并且集合数++,之后依次dfs没有被标记过的数即可。

(代码中采用的是从0到(1<

代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int maxn = 1 << 23;
bool a[maxn];//用于记录哪个是给出的数
bool vis[maxn];
int n, m, x;
void dfs(int x) {
	if (vis[x])return;
	vis[x] = true;
	for (int i = 0; i <= n; i++)
		if (x&(1 << i))//二进制第i+1位为1
			dfs(x ^ (1 << i));
	if (a[x]) dfs((1 << n) - 1 - x);//获得这个数在(1<

 

 

 

你可能感兴趣的:(逻辑运算,思维,搜索)