Problem Description
Input
Output
One answer one line.
Sample Input
8 10 0 1 1 2 1 3 2 4 3 4 0 5 5 6 6 7 3 6 4 7
Sample Output
3
Author
Source
本题考查并查集,主要该思考的点式要围成一块地方,那么这个集合是联通的所以有相同根的时候就是一个地方,每相等一次,就加一次,以下是我写的代码。
#include<stdio.h>
int a[1000],n,m,d,b;
void fu()//给数组初始化,令值等于本身的角标
{
int i;
for(i=0;i<=n-1;i++)
a[i]=i;
}
int fine(int x)//寻找根节点的函数
{
int r=x;
while(r!=a[r])
r=a[r];
int i,j;
i=x;
while(i!=r)
{
j=a[i];
a[i]=r;
i=j;
}
return r;
}
void join(int x,int y)//并两个集合的函数
{int fx,fy;
fx=fine(x);
fy=fine(y);
if(fx!=fy)
a[fx]=fy;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int c=0;
fu();
while(m--)
{
scanf("%d%d",&d,&b);
if(fine(d)==fine(b))//每两个元素的根节点相同,就加一个地方
c++;
else
join(d,b);
}
printf("%d\n",c);
}
return 0;
}