Single Round Match 480 Round 1 - Division I, Level Two NetworkSecurity

本文探讨了一种在网络环境中优化电脑到服务器连接安全性的策略。通过集合表示法和深度优先搜索算法,实现对特定服务器的保护,确保网络整体安全性。详细介绍了算法实现过程及其实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先注意到我们只会保护电脑到服务器的边。不回去保护电脑之间的边。原因很简单,电脑到电脑的边最终还是得接到电脑到服务器的边上去。那么我们用一个集合st表示电脑i能到的服务器的集合st[i]。考虑i的所有后继j,如果所有的j都不能到某个服务器,而i能到,那么就把i到这个服务器的边保护起来就可以了。

#include <bits/stdc++.h>
#define maxn 55
using namespace std;
int n,m,a[maxn][maxn];
long long st[maxn],dp[maxn];
long long dfs(int u)
{
	if(dp[u]!=-1)
		return dp[u];
	dp[u]=st[u];
	for(int v=0;v<n;v++)
	{
		if(a[u][v])
		{
			dp[u]|=dfs(v);
		}
	}
	return dp[u];
}
int bitcount(long long x)
{
	return x==0?0:bitcount(x>>1)+(x&1);
}
class NetworkSecurity
{
public: int secureNetwork(vector <string> clientCable, vector <string> serverCable)
	{
		n=clientCable.size();
		m=serverCable[0].length();
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(clientCable[i][j]=='Y')
					a[i][j]=1;
				else
					a[i][j]=0;
			}
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(serverCable[i][j]=='Y')
					st[i]|=(1LL<<j);
			}
		}
		memset(dp,-1,sizeof(dp));
		for(int i=0;i<n;i++)
		{
			dfs(i);
		}
		int ans=0;
		for(int i=0;i<n;i++)
		{
			long long son=0;
			for(int j=0;j<n;j++)
			{
				if(a[i][j])
					son|=dp[j];
			}
			ans=ans+bitcount(dp[i]^son);
		}
		return ans;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值