网易首页 > 网易号 > 正文 申请入驻

2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩

0
分享至

2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示

在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j。

一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,

且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。

这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。

假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。

我们可以从 initial 中删除一个节点,

并完全移除该节点以及从该节点到任何其他节点的任何连接。

请返回移除后能够使 M(initial) 最小化的节点。

如果有多个节点满足条件,返回索引 最小的节点 。

initial 中每个整数都不同。

输出:graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]。

输入:0。

答案2023-06-10:

主要思路如下:

1.建立并查集,将感染恶意软件的节点标记出来。

2.遍历节点连接,如果两个节点都没有被感染,则在并查集中合并这两个节点。

3.对于initial中的每个节点,遍历其能够直接连接的节点,如果节点未被感染,则将其在并查集中的祖先标记为initial中的该节点,如果该祖先已被标记为其他initial中的节点,则将其标记为-2。

4.统计在同一个initial的所有节点中,连接的总节点数,找出连接数最多的initial节点。

5.返回最小索引的节点。

时间复杂度为$O(n^2)$,其中n是节点数,因为要对每个节点进行遍历和合并操作,最坏情况下需要$O(n^2)$次遍历和合并操作。

空间复杂度为O(n),其中n是节点数,因为需要使用一个并查集数组来存储节点的父节点,另外还需要使用一个数组来记录每个节点是否被感染和每个initial节点的连接数量。这些数据占用的空间都是O(n)的。

go完整代码如下:

packagemain
import(
"fmt"
"sort"
)
funcminMalwareSpread(graph[][]int,initial[]int)int{
n:=len(graph)
virus:=make([]bool,n)
for_,i:=rangeinitial{
virus[i]=true
}
uf:=NewUnionFind(n)
fori:=0;iforj:=0;jifgraph[i][j]==1&&!virus[i]&&!virus[j]{
uf.Union(i,j)
}
}
}
infect:=make([]int,n)
fori:=rangeinfect{
infect[i]=-1
}
for_,v:=rangeinitial{
fornext:=0;nextifv!=next&&!virus[next]&&graph[v][next]==1{
f:=uf.Find(next)
ifinfect[f]==-1{
infect[f]=v
}elseifinfect[f]!=-2&&infect[f]!=v{
infect[f]=-2
}
}
}
}
cnt:=make([]int,n)
fori:=0;iifinfect[i]>=0{
cnt[infect[i]]+=uf.size[i]
}
}
sort.Ints(initial)
ans:=initial[0]
count:=cnt[ans]
for_,i:=rangeinitial{
ifcnt[i]>count{
ans=i
count=cnt[i]
}
}
returnans
}
typeUnionFindstruct{
father[]int
size[]int
}
funcNewUnionFind(nint)*UnionFind{
father:=make([]int,n)
size:=make([]int,n)
fori:=0;ifather[i]=i
size[i]=1
}
return&UnionFind{father,size}
}
func(uf*UnionFind)Find(iint)int{
help:=make([]int,0)
fori!=uf.father[i]{
help=append(help,i)
i=uf.father[i]
}
for_,v:=rangehelp{
uf.father[v]=i
}
returni
}
func(uf*UnionFind)Union(i,jint){
fi,fj:=uf.Find(i),uf.Find(j)
iffi!=fj{
ifuf.size[fi]>=uf.size[fj]{
uf.father[fj]=fi
uf.size[fi]+=uf.size[fj]
}else{
uf.father[fi]=fj
uf.size[fj]+=uf.size[fi]
}
}
}
funcmain(){
graph:=[][]int{{1,1,0},{1,1,0},{0,0,1}}
initial:=[]int{0,1}
fmt.Println(minMalwareSpread(graph,initial))
}

rust完整代码如下:

fnmain(){
letgraph=vec![vec![1,1,0],vec![1,1,0],vec![0,0,1]];
letinitial=vec![0,1];
println!("{}",min_malware_spread(graph,initial));
}
structUnionFind{
father:Vec,
size:Vec,
help:Vec,
}
implUnionFind{
fnnew(n:usize)->Self{
letmutfather=vec![0;n];
letmutsize=vec![0;n];
letmuthelp=vec![0;n];
foriin0..n{
father[i]=iasi32;
size[i]=1;
}
Self{father,size,help}
}
fnfind(&mutself,muti:i32)->i32{
letmuthi=0;
whilei!=self.father[iasusize]{
self.help[hiasusize]=i;
hi+=1;
i=self.father[iasusize];
}
whilehi!=0{
hi-=1;
self.father[self.help[hiasusize]asusize]=i;
}
i
}
fnunion(&mutself,i:i32,j:i32){
letfi=self.find(i);
letfj=self.find(j);
iffi!=fj{
ifself.size[fiasusize]>=self.size[fjasusize]{
self.father[fjasusize]=fi;
self.size[fiasusize]+=self.size[fjasusize];
}else{
self.father[fiasusize]=fj;
self.size[fjasusize]+=self.size[fiasusize];
}
}
}
}
fnmin_malware_spread(graph:Vec>,initial:Vec)->i32{
letmutgraph=graph;
letmutinitial=initial;
letn:usize=graph.len();
letmutvirus=vec![false;n];
foriininitial.iter(){
virus[*iasusize]=true;
}
letmutuf=UnionFind::new(n);
foriin0..n{
forjin0..n{
ifgraph[i][j]==1&&!virus[i]&&!virus[j]{
uf.union(iasi32,jasi32);
}
}
}
letmutinfect=vec![-1;n];
for&vininitial.iter(){
fornextin0..n{
ifv!=nextasi32&&!virus[next]&&graph[vasusize][nextasusize]==1{
letf=uf.find(nextasi32);
ifinfect[fasusize]==-1{
infect[fasusize]=v;
}elseifinfect[fasusize]!=-2&&infect[fasusize]!=v{
infect[fasusize]=-2;
}
}
}
}
letmutcnt=vec![0;n];
foriin0..n{
ifinfect[i]>=0{
cnt[infect[i]asusize]+=uf.size[iasusize];
}
}
initial.sort();
letmutans=initial[0];
letmutcount=cnt[ansasusize];
for&iininitial.iter(){
ifcnt[iasusize]>count{
ans=i;
count=cnt[iasusize];
}
}
ans
}

c++完整代码如下:

#include
#include
#include
usingnamespacestd;
classUnionFind{
public:
vectorfather;
vectorsize;
//Constructor
UnionFind(intn){
father.resize(n);
size.resize(n);
for(inti=0;ifather[i]=i;
size[i]=1;
}
}
//Findoperation
intFind(inti){
vectorhelp;
while(i!=father[i]){
help.push_back(i);
i=father[i];
}
for(autov:help){
father[v]=i;
}
returni;
}
//Unionoperation
voidUnion(inti,intj){
intfi=Find(i);
intfj=Find(j);
if(fi!=fj){
if(size[fi]>=size[fj]){
father[fj]=fi;
size[fi]+=size[fj];
}
else{
father[fi]=fj;
size[fj]+=size[fi];
}
}
}
};
intminMalwareSpread(vector>&graph,vector&initial){
intn=graph.size();
vectorvirus(n,false);
for(autoi:initial){
virus[i]=true;
}
UnionFinduf(n);
for(inti=0;ifor(intj=0;jif(graph[i][j]==1&&!virus[i]&&!virus[j]){
uf.Union(i,j);
}
}
}
vectorinfect(n,-1);
for(autov:initial){
for(intnext=0;nextif(v!=next&&!virus[next]&&graph[v][next]==1){
intf=uf.Find(next);
if(infect[f]==-1){
infect[f]=v;
}
elseif(infect[f]!=-2&&infect[f]!=v){
infect[f]=-2;
}
}
}
}
vectorcnt(n,0);
for(inti=0;iif(infect[i]>=0){
cnt[infect[i]]+=uf.size[i];
}
}
sort(initial.begin(),initial.end());
intans=initial[0];
intcount=cnt[ans];
for(autoi:initial){
if(cnt[i]>count){
ans=i;
count=cnt[i];
}
}
returnans;
}
intmain(){
vector>graph={{1,1,0},{1,1,0},{0,0,1}};
vectorinitial={0,1};
cout<
return0;
}

c完整代码如下:

#include
#include
intcmpfunc(constvoid*a,constvoid*b);
typedefstruct{
int*father;
int*size;
}UnionFind;
UnionFind*createUnionFind(intn){
UnionFind*uf=(UnionFind*)malloc(sizeof(UnionFind));
uf->father=(int*)malloc(n*sizeof(int));
uf->size=(int*)malloc(n*sizeof(int));
for(inti=0;iuf->father[i]=i;
uf->size[i]=1;
}
returnuf;
}
intfind(UnionFind*uf,inti){
inthi=0;
int*help=(int*)malloc(1000*sizeof(int));
while(i!=uf->father[i]){
help[hi]=i;
hi+=1;
i=uf->father[i];
}
for(intj=0;juf->father[help[j]]=i;
}
free(help);
returni;
}
voidunionSet(UnionFind*uf,inti,intj){
intfi=find(uf,i);
intfj=find(uf,j);
if(fi!=fj){
if(uf->size[fi]>=uf->size[fj]){
uf->father[fj]=fi;
uf->size[fi]+=uf->size[fj];
}
else{
uf->father[fi]=fj;
uf->size[fj]+=uf->size[fi];
}
}
}
intminMalwareSpread(int**graph,intgraphSize,int*graphColSize,int*initial,intinitialSize){
intn=graphSize;
int*virus=(int*)calloc(n,sizeof(int));
for(inti=0;ivirus[initial[i]]=1;
}
UnionFind*uf=createUnionFind(n);
for(inti=0;ifor(intj=0;jif(graph[i][j]==1&&virus[i]==0&&virus[j]==0){
unionSet(uf,i,j);
}
}
}
int*infect=(int*)malloc(n*sizeof(int));
for(inti=0;iinfect[i]=-1;
}
for(intk=0;kintv=initial[k];
for(intnext=0;nextif(v!=next&&virus[next]==0&&graph[v][next]==1){
intf=find(uf,next);
if(infect[f]==-1){
infect[f]=v;
}
elseif(infect[f]!=-2&&infect[f]!=v){
infect[f]=-2;
}
}
}
}
int*cnt=(int*)calloc(n,sizeof(int));
for(inti=0;iif(infect[i]>=0){
cnt[infect[i]]+=uf->size[i];
}
}
int*sortedInitial=(int*)malloc(initialSize*sizeof(int));
for(inti=0;isortedInitial[i]=initial[i];
}
qsort(sortedInitial,initialSize,sizeof(int),cmpfunc);
intans=sortedInitial[0];
intcount=cnt[ans];
for(inti=0;iif(cnt[sortedInitial[i]]>count){
ans=sortedInitial[i];
count=cnt[ans];
}
}
free(virus);
free(cnt);
free(sortedInitial);
free(infect);
free(uf->father);
free(uf->size);
free(uf);
returnans;
}
intcmpfunc(constvoid*a,constvoid*b){
return(*(int*)a-*(int*)b);
}
intmain(){
intgraphSize=3;
intgraphColSize[]={3,3,3};
intgraphData[][3]={{1,1,0},{1,1,0},{0,0,1}};
int**graph=(int**)malloc(graphSize*sizeof(int*));
for(inti=0;igraph[i]=(int*)malloc(graphColSize[i]*sizeof(int));
for(intj=0;jgraph[i][j]=graphData[i][j];
}
}
intinitial[]={0,1};
intinitialSize=2;
intans=minMalwareSpread(graph,graphSize,graphColSize,initial,initialSize);
printf("%d\n",ans);
for(inti=0;ifree(graph[i]);
}
free(graph);
return0;
}

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
日本银行巨头突然爆雷!

日本银行巨头突然爆雷!

第一财经资讯
2024-06-20 12:39:00
曝45岁伏明霞离婚,净身出户原因揭晓,71岁百亿丈夫只说6个字

曝45岁伏明霞离婚,净身出户原因揭晓,71岁百亿丈夫只说6个字

深度知局
2024-05-20 19:25:53
拍客|桂林一男子开橡皮艇在深水区5小时救援20多人:水深达2米,不救不行

拍客|桂林一男子开橡皮艇在深水区5小时救援20多人:水深达2米,不救不行

封面新闻
2024-06-20 11:26:53
美国U17男篮星二代云集,詹姆斯二儿子&安东尼之子落选

美国U17男篮星二代云集,詹姆斯二儿子&安东尼之子落选

懂球帝
2024-06-20 12:02:56
已做好牺牲准备!海警登检菲船并不轻松:画面显示我方穿了防弹衣

已做好牺牲准备!海警登检菲船并不轻松:画面显示我方穿了防弹衣

青年的背包
2024-06-19 20:01:11
3000万抗旱资金去哪了?河南财政拨3000万抗旱,结果老百姓不买账

3000万抗旱资金去哪了?河南财政拨3000万抗旱,结果老百姓不买账

三月柳
2024-06-18 16:06:45
波音CEO承认员工曾报复举报人!有“吹哨人”被曝离奇死亡

波音CEO承认员工曾报复举报人!有“吹哨人”被曝离奇死亡

南方都市报
2024-06-20 09:28:17
中国校花在美国留学,却偷偷带两个白人男子回宿舍,闺蜜:要自爱

中国校花在美国留学,却偷偷带两个白人男子回宿舍,闺蜜:要自爱

爱讲故事的猪头
2023-09-06 17:13:07
河南女学霸2次高考查分,从627分变成335分,到底怎么回事?

河南女学霸2次高考查分,从627分变成335分,到底怎么回事?

莉雅细细谈
2024-06-17 20:44:48
博汇股份“补税”事件调查:争议产品多次检测成分 工艺优化被疑为了避税

博汇股份“补税”事件调查:争议产品多次检测成分 工艺优化被疑为了避税

财联社
2024-06-19 22:05:07
阿根廷5月贸易盈余26.56亿美元

阿根廷5月贸易盈余26.56亿美元

财联社
2024-06-20 03:05:24
重庆老板将少女藏地下室7年,使她怀孕5次,却被其妻子发现了

重庆老板将少女藏地下室7年,使她怀孕5次,却被其妻子发现了

星辰故事屋
2024-06-18 18:29:55
知名人士:先救港股策略或已成功,A股3000点保卫战成功概率大增!将保护散户落到实处,中国股市何愁不好

知名人士:先救港股策略或已成功,A股3000点保卫战成功概率大增!将保护散户落到实处,中国股市何愁不好

和讯网
2024-06-20 11:33:53
冷藏车遇难8人安葬后续:最新内情被曝,司机或判7年,家属斥谣言

冷藏车遇难8人安葬后续:最新内情被曝,司机或判7年,家属斥谣言

影像温度
2024-06-20 10:18:28
下午6点中国女排决战日本,看到大名单球迷怒喷:她上场就关电视

下午6点中国女排决战日本,看到大名单球迷怒喷:她上场就关电视

我就是一个说球的
2024-06-20 12:44:08
“中国首次将核弹头置于高度战备状态”

“中国首次将核弹头置于高度战备状态”

枢密院十号
2024-06-17 23:44:53
李连杰海拔4000米高山修行,62岁利智同行,夫妻恩爱称为世界和平

李连杰海拔4000米高山修行,62岁利智同行,夫妻恩爱称为世界和平

娱乐白名单
2024-06-18 11:16:15
欧洲杯重大争议!VAR拒绝改判,东道主获利了,主裁判被球迷狂嘘

欧洲杯重大争议!VAR拒绝改判,东道主获利了,主裁判被球迷狂嘘

侃球熊弟
2024-06-20 00:37:43
阿根廷5月贸易盈余26.56亿美元

阿根廷5月贸易盈余26.56亿美元

每日经济新闻
2024-06-20 05:37:07
医生提醒:过了65岁的人,宁愿一周不洗澡,也不要随便做这4事

医生提醒:过了65岁的人,宁愿一周不洗澡,也不要随便做这4事

今日养生之道
2024-06-19 19:50:37
2024-06-20 14:46:44
moonfdd
moonfdd
福大大架构师每日一题
427文章数 7关注度
往期回顾 全部

科技要闻

小米SU7流量泼天,富贵却被蔚来接住了

头条要闻

深圳网红学位房每平从14万跌到4万 中介:每月都有成交

头条要闻

深圳网红学位房每平从14万跌到4万 中介:每月都有成交

体育要闻

绿军的真老大,开始备战下赛季了

娱乐要闻

叶舒华参加柯震东生日聚会,五毒俱全

财经要闻

日本银行巨头突然爆雷!

汽车要闻

售价11.79-14.39万元 新一代哈弗H6正式上市

态度原创

本地
健康
时尚
公开课
军事航空

本地新闻

2024·合肥印象|用崭新视角对话城市发展

晚餐不吃or吃七分饱,哪种更减肥?

衣不穿花,裙不上膝,这才是50岁女人夏季应有的打扮,太美了

公开课

近视只是视力差?小心并发症

军事要闻

普京再送金正恩轿车 两人轮流当司机

无障碍浏览 进入关怀版