首页 > 其他分享 >928. 尽量减少恶意软件的传播 II

928. 尽量减少恶意软件的传播 II

时间:2024-02-18 16:13:05浏览次数:23  
标签:II 结点 int 恶意软件 initial 感染 cnt 928 sum

原题链接

我们先根据题意构建图G。然后我们可以得出如果一个普通结点A连接着两个感染源结点,那么其无论如何都会被感染;因此我们要找寻那些只与一个感染源结点相连接的普通节点;

然后我们在图中把感染源结点擦除,可以得到几个只由普通结点构成的图,我们把这几张图看作一个集合(即使用并查集);接着我们遍历每个集合,得到该集合是否只与一个感染源结点相连接,并累加。

Code

 

class Solution {
public:
    static const int N=305;
  //father负责并查集的实现
  //virus负责对结点是否为感染源结点进行标记
  //Size负责统计集合内元素个数
  //cnt负责统计每个集合连接的感染源结点下标(-1,表示未找到,-2表示有两个以上感染源结点连接)
  //sum负责统计每个感染源结点去除后可恢复多少普通结点 int father[N],virus[N],n,Size[N],cnt[N],sum[N]; void build(vector<int>& initial){ //初始化 for (int i=0;i<n;i++){ father[i]=i; Size[i]=1; cnt[i]=-1; } for (auto &i : initial){ virus[i]=1; } } int find(int x){ if (x!=father[x]) father[x]=find(father[x]); return father[x]; } void Union(int x,int y){ int fx=find(x); int fy=find(y); if (fx!=fy){ father[fx]=fy; Size[fy]+=Size[fx]; } } int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) { n=graph.size(); int n2=initial.size(); build(initial); for (int i=0;i<n;i++){ for (int j=0;j<n;j++){ if (j!=i && virus[i]==0 && graph[i][j]==1 && virus[j]==0) Union(i,j); //对普通结点进行合并 } } for (int i=0;i<n2;i++){ for (int j=0;j<n;j++){ if (j!=initial[i] && virus[j]==0 && graph[initial[i]][j]==1){ //找寻每个集合所连接的感染源结点 int fj=find(j); if (cnt[fj]==-1) cnt[fj]=initial[i]; else if (cnt[fj]!=initial[i]) cnt[fj]=-2; } } } sort(initial.begin(),initial.end()); for (int i=0;i<n;i++){ if (father[i]==i && virus[i]==0 && cnt[i]>=0){ //统计每个感染源结点去除后可恢复多少普通结点 sum[cnt[i]]+=Size[i]; } } int Max=0,cnt_i=initial[0]; for (int i=0;i<n2;i++){ if (sum[initial[i]]>Max){ Max=sum[initial[i]]; cnt_i=initial[i]; } } return cnt_i; } };

 

标签:II,结点,int,恶意软件,initial,感染,cnt,928,sum
From: https://www.cnblogs.com/purple123/p/18019456

相关文章

  • 代码随想录算法训练营第十八天 | 112. 路径总和,113. 路径总和ii ,106.从中序与后序遍
     513.找树左下角的值 已解答中等 相关标签相关企业 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层最左边 节点的值。假设二叉树中至少有一个节点。 示例1:输入:root=[2,1,3]输出:1示例2:输入:[1,2,3,4,null,5,6,n......
  • 洛谷题单指南-递推与递归-P1928 外星密码
    原题链接:https://www.luogu.com.cn/problem/P1928题意解读:要对形如xxx[Nxxx]xxx的字符串进行解码,[]内第一个数表示括号中字符串重复的次数,可以嵌套。解题思路:用递归进行处理,设函数decode(start,end)将下标从start到end之间字符串进行解码递归过程如下:遍历start~end的每一个字......
  • 在涉及恶意软件的任何调查中,寻找持久性点(也称为“自动启动扩展点”或ASEP)是一项经常出
    AutostartcategoriesWhenyoulaunchAutorunsforthefirsttime,allautostartentriesonthesystemaredisplayedinonelonglistontheEverythingtab.As Figure4-8 shows,thedisplayincludesupto19othertabsthatbreakdownthecompletelistint......
  • ASCII编码的诞生:解决字符标准化与跨平台通信的需求
    在计算机的发展过程中,字符的表示和传输一直是一个重要的问题。为了实现字符的标准化和跨平台通信,ASCII(AmericanStandardCodeforInformationInterchange)编码应运而生。Ascii编码解码|一个覆盖广泛主题工具的高效在线平台(amd794.com)https://amd794.com/asciiencordec......
  • CF1928
    第一次写整场CF的题解。A:只有一边长度是$2$的倍数才可以选择剪下拼成另一个长方形,两边都判一下就行了:记录B:容易发现,加上某个排列长度为$n$的后,最多可以使两个相减为$n-1$的两个元素相等,于是双指针即可。记录C:先枚举他所得到的数是若干轮$2k-2$中的前$k$个还是......
  • CF1928E题解
    ModularSequence题目传送门题解发现\(a_i+y\)与\(a_i\bmody\)均不改变\(a_i\)模\(y\)的余数,所以答案序列的每个元素均可表示为\(x\bmody+ky\)的形式,先让\(s\)减去\(n\times(x\bmody)\),再除以\(y\),这样原序列可以被划分为一个从\(\lfloor\dfrac{x}{y}\rflo......
  • 137. 只出现一次的数字 II(中)
    目录题目法一、排序法二、位运算题目给你一个整数数组nums,除某个元素仅出现一次外,其余每个元素都恰出现三次。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。示例1:输入:nums=[2,2,3,2]输出:3示例......
  • CodeForces 1928F Digital Patterns
    洛谷传送门CF传送门为什么我场上被卡常了。转化题意,将\(a,b\)差分,答案为在\(a,b\)选出相同长度的不含\(0\)的子段方案数。设\(a\)选出长度为\(i\)的不含\(0\)的子段方案数为\(x_i\),\(b\)选出长度为\(i\)的不含\(0\)的子段方案数为\(y_i\)。答案为\(\su......
  • CF1928E Modular Sequence
    原题链接设\(p=x\bmody\)。思考发现本质是\(x,x+y,x+2y,\cdots,x+k_1y,p,p+y,p+2y,\cdots,p+k_2y,p,p+y,p+2y,\cdots,p+k_3y\cdots\),即每次二操作会使\(y\)的系数变为\(0\)。枚举第\(i\)次操作是第一次二操作,记\(s_1=s-(i\timesx+y\times\dfrac{i(i-1)}{2}+(n-i)\time......
  • CF1928D Lonely Mountain Dungeons
    原题链接设\(F(n,m)\)是将\(n\)个同种族的人放到\(m\)个队伍中可以获得的贡献。可以发现在同一个队伍中的人不能互相产生贡献,所以尽可能平均分配是最优的。设\(p=\lfloor\dfrac{n}{m}\rfloor,q=n\bmodm\),那么有\(m-q\)个队伍中有\(p\)个人,\(q\)个队伍中有\(p+1\)......