在参加了Codeforces的一次比赛之后......发现和来自地球不同角落的人参加一场比赛,十分有趣,尤其是看到standing上的排名上各种各样的国旗,竟是一件十分好玩的事情........当然,以我现在的水平.....只能是打酱油了......
在CF上两个小时刷了两道水题之后,被第三题卡住了.....赛后经杨大神指点,才发现有并查集这么一个好的东东......而且值得欣慰的是,我的初始想法就是并查集的思想......可惜,我没能写出代码......在程序执行过程中,遇到了一些问题,还好,GG及时给出了指点.......最后,终于水过了该题!十分感谢barty以及GG!
在CF上两个小时刷了两道水题之后,被第三题卡住了.....赛后经杨大神指点,才发现有并查集这么一个好的东东......而且值得欣慰的是,我的初始想法就是并查集的思想......可惜,我没能写出代码......在程序执行过程中,遇到了一些问题,还好,GG及时给出了指点.......最后,终于水过了该题!十分感谢barty以及GG!
贴上代码:
#define MAXN 1003
#include <stdio.h>
#include <string.h>
typedef struct
{
int rank,parent;
}UFSTree;
UFSTree ut[MAXN];
int a[MAXN][3],n;
bool flag[MAXN];
void make_UFSTree()
{
int i;
memset(flag,false,(n+1)*sizeof(bool));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d %d",&a[i][1],&a[i][2]);
ut[i].rank=1;ut[i].parent=i;
}
return;
}
int FIND_SET(int x)
{
if(x!=ut[x].parent)
return(FIND_SET(ut[x].parent));
else return x;
}
void UNION(int x,int y)
{
x=FIND_SET(x);
y=FIND_SET(y);
if(ut[x].rank>ut[y].rank) ut[y].parent=x;
else
{
ut[x].parent=y;
if(ut[x].rank==ut[y].rank)
ut[y].rank++;
}
}
int main()
{
make_UFSTree();
int i,j,cnt=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i][1]==a[j][1] || a[i][2]==a[j][2]) UNION(i,j);
for(i=1;i<=n;i++)
{
int temp=FIND_SET(i);
if(!flag[temp])
{
cnt++;
flag[temp]=true;
}
}
printf("%d\n",cnt-1);
}