题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2 998
前两天听学长简单的讲了一下并查集,于是找了两个最简单的并查集水题做了一下,依次就ac了,方法效率不高,等过些天深入学习时再修改吧。
【代码如下】
#include <cstdio>
#include <algorithm>
using namespace std;
int f[1010],n;
void connect(int i,int j) //连接
{
if(f[i]==f[j]) //如果已经连接, 直接返回
return ;
int p=f[i];
int q=f[j];
for(int i=1;i<=n;i++)//将所有和 f[i]相同的元素置为 和f[j]相同,从而实现了联通
{
if(f[i]==p)
f[i]=q;
}
}
int main()
{
int m;
while(scanf("%d",&n)!=EOF&&n)
{
int st;
scanf("%d",&m);
for(int i=1;i<=n;i++)
{
f[i]=i; //初始化,使得初始状态,每一个占一个集合,都不联通
}
for(int i=0;i<m;i++)
{
int p,q;
scanf("%d%d",&p,&q);
connect(p,q);
}
st=0;
for(int i=1;i<=n;i++) //查找有多少不同集合就行了,修路的话再-1;
{
if(f[i]==i)
st++;
}
printf("%d\n",st-1);
}
return 0;
}
hdu 1231 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213
2 5 3 1 2 2 3 4 5 5 1 2 5
2 4
【代码如下】
#include <iostream>
#include <algorithm>
using namespace std;
int n,k,f[1010];
void connect(int a,int b)
{
if(f[a]==f[b])
return ;
int p=f[a];
int q=f[b];
for(int i=1;i<=n;i++)
if(f[i]==q)
f[i]=p;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=0;i<k;i++)
{
int a,b;
cin>>a>>b;
connect(a,b);
}
// sort(f+1,f+n+1);
int ans=0;
for(int i=1;i<=n;i++)
{
if(f[i]==i)
ans++;
}
cout<<ans<<endl;
}
return 0;
}原文:http://blog.csdn.net/chaiwenjun000/article/details/46367439