今天看了并查集的简单应用.
它的功能就是将不同元素归入几个集合内.
并用相同的数来代表它们.从而查找出任意两个元素是否在同一集合中.
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int folk[1005];
int vis[1005];
int dsu(int u)
{
return u == folk[u] ? u : folk[u] = dsu(folk[u]);
}
int main()
{
int m,n;
while (scanf("%d",&n)&&n)
{
int i;
scanf("%d",&m);
memset(vis,0,sizeof(vis));
for (i=1;i<=n;i++)
folk[i]=i;
for(i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
int aa=dsu(a);
int bb=dsu(b);
if (aa!=bb)
{
folk[aa]=b;
}
}
int sum = 0;
for (i=1;i<=n;i++)
{
int tmp=dsu(i);
if (!vis[tmp])
{
vis[tmp]=1;
sum ++;
}
}
printf("%d\n",sum-1);
}
return 0;
}