标签:
2 5 3 1 2 2 3 4 5 5 1 2 5
2 4
1.可以求出一共有多少个根节点(即fa[i]==-1的i个数)
2.可以用原始连通分量数n 减去 有效的合并次数。
即每次合并两个连通分量就会使得总的分量数目减少1.
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1000+10;
int fa[maxn];
int Find(int x)
{
if(fa[x]==-1)
return x;
return fa[x]=Find(fa[x]);
}
void mix(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
fa[fx]=fy;
//return ;
}
int main()
{
int t,n,m,x,y;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(fa,-1,sizeof(fa));
while(m--)
{
cin>>x>>y;
mix(x,y);
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(fa[i]==-1)
ans++;
}
cout<<ans<<endl;
}
}
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1000+5;
int fa[maxn];
int Find(int x)
{
if(fa[x]==-1)
return x;
return fa[x]=Find(fa[x]);
}
int mix(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
{
fa[fx]=fy;
return 1;
}
return 0;
}
int main()
{
int t,n,m,x,y;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(fa,-1,sizeof(fa));
int ans=n;
while(m--)
{
cin>>x>>y;
ans-=mix(x,y);
}
cout<<ans<<endl;
}
return 0;
}
HDU 1213 How Many Tables (并查集,连通分支数,两种方式)
标签:
原文地址:http://blog.csdn.net/hurmishine/article/details/51623118