P1536 村村通 并查集
P1536 村村通
本题要求统计连通分块的个数,同一个连通分块可以用并查集进行处理
/*
村村通
*/
#include<iostream>
using namespace std;
const int Max=1010;
int pre[Max];
int n,m,cnt;
void make()
{
for (int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int find(int x)
{
int r=x;
while (r!=pre[r])
{
r=pre[r];
}
int i=x,j;
while (r!=i)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void Union(int x,int y)
{
int fx=find(x);
int fy=find(y);
if (fx!=fy)
{
cnt++;
pre[fx]=fy;
}
}
int main()
{
cin>>n>>m;
while (n!=0)
{
make();
cnt=0;
for (int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
Union(x,y);
}
cout<<n-cnt-1<<endl;
cin>>n;
if (n==0) break;
cin>>m;
}
}
浙公网安备 33010602011771号