资讯详情

非常棒的并查集入门题目

2017-05-11 阅读:128 来源:福州博洋软件开发与测试培训学校
进入>

这是一道非常棒的并查集入门题目,不懂的可以直接看下面的代码:

#include

#include

usingnamespacestd;

intf[50010];

intsum=0;

//Accepted360K313MS

intfind1(intx){

if(f[x]!=x){

f[x]=find1(f[x]);

}

returnf[x];

}

voidmerge1(inta,intb){

intf1=find1(a);

intf2=find1(b);

if(f1!=f2){

f[f2]=f1;

sum--;

}

}

intmain()

{

intn,m,p=1;

while(scanf("%d%d",&n,&m)!=EOF){

if(n==0&&m==0){break;}

for(inti=1;i<=n;i++){

f[i]=i;

}

sum=n;

for(inti=1;i<=m;i++){

inta,b;

scanf("%d%d",&a,&b);

merge1(a,b);

}

printf("Case%d:%d\n",p++,sum);

}

return0;

}

//另一版本,大概思路相似,仅仅就并的时候,少的像多的并。

#include

#include

#include

usingnamespacestd;

//Accepted556K297MS

structstudent{

intindex;

intnum;

student(){

num=1;

}

};

studentf[50010];///刚刚开始数组开小了,runtimeerror!

intn,m,sum=0;

intfind1(intx){//查找

if(f[x].index!=x){

f[x].index=find1(f[x].index);

}

returnf[x].index;

}

voidmerge1(inta,intb){//合并

intf1=find1(f[a].index);

intf2=find1(f[b].index);

if(f1!=f2){

if(f[f1].num>=f[f2].num){

f[f1].num+=f[f2].num;

f[f2].index=f1;

}

else{

f[f2].num+=f[f1].num;

f[f1].index=f2;

}

sum--;

}

}

voidinit(){//初始化

sum=n;

for(inti=1;i<=n;i++){

f[i].index=i;

}

}

intmain()

{

intp=1;

while(scanf("%d%d",&n,&m)!=EOF){

if(!n&&!m){break;}

init();

for(inti=1;i<=m;i++){

inta,b;

scanf("%d%d",&a,&b);

merge1(a,b);

}

printf("Case%d:%d\n",p++,sum);

}

return0;

}

官网:

QQ是:

加载全文

免责声明:本站部分内容、图片来自用户自主上传,如果您对本站信息资源版权的归属问题存有异议,请您致信,我们会立即做出答复并及时解决。如果您认为本站有侵犯您权益的行为,请通知我们,我们一定根据实际情况及时处理。

以上是福州博洋软件开发与测试培训学校为大家整理的有关非常棒的并查集入门题目的全部内容,更多精彩请访问学习资讯新闻专栏。

相关课程

更多>
2020猎学网广告栏
申请课程免费试听名额

课程顾问24小时内联系您

你好

顾问将于24小时内联系您!

确定
在线咨询 微信咨询 立即报名
申请1对1课程顾问咨询服务
×
你好

顾问将于24小时内联系您!

确定
福州猎学网 >福州博洋软件开发与测试培训学校 >非常棒的并查集入门题目