题解 | 隐匿社交网络

隐匿社交网络

https://www.nowcoder.com/practice/2870f9db6aeb4eb08fbd6460397f9bf4

建图,定义62个虚点,分别表示第i位上是否是1,然后遍历所有数,将其连向对应的虚点。

最后进行dfs即可。

需要注意的一个细节是虚点不能被计入答案,需要减去这部分。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int const N = 2e5+9;
int const inf = 1e9+7;
int n;
int w[N];
vector<int> v[N];
int vis[N];
int tot = 0,ans = 0;
int p(int j)
{
	return n + j + 1;
}

void dfs(int x)
{
	tot++;
	vis[x] = 1;
	for(auto to : v[x])
	{
		if(vis[to]) continue;
		dfs(to);
	}
	return;
}

void solve()
{
	tot = ans = 0;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=62;j++)
		{
			if((w[i] >> j) & 1)
			{
				int b = p(j);
				v[b].push_back(i);
				v[i].push_back(b);
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i]) continue;
		dfs(i);
		for(int j=0;j<=62;j++)
		{
			if(vis[p(j)])
			{
				tot--;
				vis[p(j)] = 0;
			}
		}
		ans = max(ans,tot);
		tot = 0;
		
	}
	cout<<ans<<endl;
	for(int i=1;i<=n;i++) v[i].clear(),vis[i] = 0;
	for(int j=0;j<=62;j++) vis[p(j)] = 0,v[p(j)].clear();
	return;
}
signed main()
{
	int T;cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

/*
1 1
2 2 + 1
3 3 + 2 +1

*/

全部评论

相关推荐

盖茨伯爵:一样兄弟,我从4月开始发到现在了,都三四百个了
无实习如何秋招上岸
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-11 13:34
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 14:10
码农索隆:成年人最直白的答复:已读不回
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务