http://acm.pku.edu.cn/JudgeOnline/problem?id=2524
http://acm.pku.edu.cn/JudgeOnline/problem?id=1611
code 2524
- #include<iostream>
- usingnamespacestd;
- intpre[50010],num;
- intfind(inta);
- voidun(inta,intb);
- intmain()
- {
- intn,m;
- inti,a,b,T(1);
- freopen("in.txt","r",stdin);
- while(cin>>n>>m&&n&&m)
- {
- num=n;//初始化是每个人的信仰都不同
- for(i=1;i<=50005;i++)
- pre[i]=0;
- for(i=1;i<=m;i++)
- {
- scanf("%d%d",&a,&b);
- un(a,b);
- }
- cout<<"Case"<<T++<<":"<<num<<endl;
- }
- return0;
- }
- intfind(inta)//路径压缩
- {
- intt=a,z;
- while(pre[t]!=0)t=pre[t];
- while(a!=t)
- {
- z=pre[a];
- pre[a]=t;
- a=z;
- }
- returnt;
- }
- voidun(inta,intb)
- {
- //intaa,bb;
- intaa,bb;
- aa=find(a);
- bb=find(b);
- if(aa==bb&&aa)//祖先一样的情况
- return;
- if(aa==0)
- pre[bb]=aa;
- else
- pre[aa]=bb;
- num--;
- }
code 1611
- #include<iostream>
- #include<algorithm>
- usingnamespacestd;
- shortpre[30001],num[30001];
- voidun(inta,intb);
- intfind(inta);
- intmain()
- {
- intn,i,m,a,j,b,temp;
- freopen("in.txt","r",stdin);
- while(cin>>n>>m&&m||n)
- {
- for(i=0;i<30001;i++)
- pre[i]=i;
- for(i=0;i<m;i++)
- {
- cin>>a;
- for(j=0;j<a;j++)
- {
- cin>>b;
- if(j==0)
- temp=b;
- un(temp,b);
- }
- }
- for(i=0;i<30001;i++)
- find(i);
- sort(pre,pre+30001);
- n=0,j=0;
- while(!pre[n++])j++;
- cout<<j<<endl;
- }
- return0;
- }
- intfind(inta)//未用路径压缩
- {
- intt;
- t=a;
- while(pre[t]!=t)t=pre[t];
- pre[a]=t;
- returnt;
- }
- voidun(inta,intb)
- {
- intaa,bb;
- aa=find(a);
- bb=find(b);
- if(aa==0)
- pre[bb]=aa;
- else
- pre[aa]=bb;
- }
本文解析了两道来自PKU ACM在线评测系统的题目,分别涉及并查集算法的应用。通过具体代码实现展示了如何使用并查集解决节点连接问题,并介绍了路径压缩优化技巧。
11万+

被折叠的 条评论
为什么被折叠?



