题目链接:点击打开链接
代码:
#include<string.h>
#include<algorithm>
#include<set>
#include<stdio.h>
using namespace std;
int a[1000010];
int b[1000010];
int find(int x)
{
return a[x]==x?a[x]:a[x]=find(a[x]);
}
void marge(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
a[fx]=fy;
}
set<int>s;
int main()
{
int n,m;
int i,k;
int x,y;
int T=1;
while(scanf("%d%d",&n,&m),n|m)
{
k=n;
for(i=0; i<1000000; i++)
a[i]=i;
for(i=0; i<n; i++)
b[i]=i;
char ch;
while(m--)
{
getchar();
scanf("%c",&ch);
if(ch=='M')
{
scanf("%d%d",&x,&y);
marge(b[x],b[y]);
}
else
{
scanf("%d",&x);
b[x]=k;
k++;
}
}
s.clear();
for(i=0; i<n; i++)
s.insert(find(b[i]));
printf("Case #%d: %d\n",T++,s.size());
}
return 0;
}就是用两个数组,一个是找爹用的,另外一个是记录数据用的,但隔离这个点的时候,从新给这个点找一个爹,其他的都和并查集一样。

875

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



