poj2524(并查集水题)

题目链接http://poj.org/problem?id=2524

题目大意:学校共有n个同学,告诉你m对同学信仰同一宗教,问这个学校学生信仰宗教的数目最多为多少。

例:

Sample Input

10 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
10 4
2 3
4 5
4 8
5 8
0 0

Sample Output

Case 1: 1
Case 2: 7

解题思路:直接套并查集的板子就可以了,初始化n个集合默认他们都信任不一样的宗教,初始就用n个宗教,每次给你的两个同学那个号码将他们并到一个集合就可以了,最后统计时,每当有一对同学并了,答案减1就可以了。

附上代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans,n,m;
int par[],rank[]; void init(int x)
{
for(int i=;i<=x;i++)
{
par[i]=i;
rank[i]=;
}
} int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
} void unite(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx==fy) return;
if(rank[fx]>rank[fy])
par[fy]=fx;
else
{
par[fx]=fy;
if(rank[fx]==rank[fy])
rank[fx]++;
}
} bool same(int x,int y)
{
return find(x)==find(y);
} int main()
{
int kase=;
while(cin>>n>>m&&(n||m))
{
init(n);
ans=n;
for(int i=;i<m;i++)
{
int a,b;
cin>>a>>b;
unite(a,b);
}
for(int i=;i<=n;i++)
{
if(par[i]!=i)
ans--;
}
printf("Case %d: %d\n",kase++,ans);
}
return ;
}
上一篇:OC中Runtime浅析


下一篇:FLASK 使用方法