📄 并查集.cpp
字号:
#include <iostream>
const int MaxN = 50000 + 1;
int p[MaxN] , n , m , ans , x, y , Count , Rank[MaxN];
void Make_Set(int x)
{
p[x] = x;
Rank[x] = 0;
}
void LINK(int x , int y)
{
if (Rank[x] > Rank[y])
p[y] = x;
else
{
p[x] = y;
if (Rank[x] == Rank[y]) Rank[y]++;
}
}
int FIND_SET(int x)
{
if (x != p[x])
p[x] = FIND_SET(p[x]);
return p[x];
}
void UNION(int x , int y)
{
LINK(FIND_SET(x) , FIND_SET(y) );
}
int main()
{
int i;
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
while(scanf("%d%d",&n,&m)&&(n!=0||m!=0))
{
Count++;
for(i = 1 ; i <= n ; i++) Make_Set(i);
for(i = 1 ; i <= m ; i++)
{
scanf("%d%d",&x,&y);
UNION(x,y);
}
ans = 0;
for(i = 1 ; i <= n ; i++)
if (p[i] == i) ans++;
printf("Case %d: %d\n",Count,ans);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -