/*
HDOJ 1213
并查集的基本运用,求集合数
*/
#include <iostream>
using namespace std;
int rank[1001]; //元素的秩
int p[1001]; //元素的父亲
int Find(int x)
{
int root,y,w;
y=p[x];
while(p[y] != y)
{
y=p[y];
}
root=y;
while(p[x] != y)
{
w=p[x];
p[x]=y;
x=w;
}
return root;
}
void Union(int u,int v)
{
if(rank[u] <= rank[v])
{
p[u]=v;
if(rank[u] == rank[v])
++rank[v];
}
else
p[v]=u;
}
void Init(int n)
{
for(int i=1;i<=n;i++)
{
p[i]=i;
rank[i]=0;
}
}
int main()
{
int nCase,n,m,i,a,b,u,v;
cin>>nCase;
while(nCase--)
{
cin>>n>>m;
Init(n);
for(i=0;i<m;i++)
{
cin>>a>>b;
u=Find(a);
v=Find(b);
if(u != v)
{
Union(u,v);
n--;
}
}
cout<<n<<endl;
}
return 0;
}
并查集——HDOJ 1213
最新推荐文章于 2020-06-08 14:50:33 发布