基於簡單的路徑壓縮的並查集演算法
阿新 • • 發佈:2019-02-15
void merge(int fir,int sec)
{
int i=fir,j=sec;
while(person[i].parent!=i)
{
person[i].parent=person[person[i].parent].parent;
i=person[i].parent;
}
while(person[j].parent!=j)
{
person[j].parent=person[person[j].parent].parent;
j=person[j].parent;
}
if(i!=j)
{
if(person[i].nodenum>person[j].nodenum)
{
person[j].parent=i;
person[i].nodenum+=person[j].nodenum;
sum--;
}
else
{
person[i].parent=j;
person[j].nodenum+=person[i].nodenum;
sum--;
}
}
}
int main()
{
int n,m;
int first,second;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
person[i].parent=i,person[i].nodenum=1;
sum=n;
for(int i=0;i<m;i++)
{
scanf("%d%d",&first,&second);
merge(first,second);
}
printf("%d\n",sum);
}
return 0;
}
{
int i=fir,j=sec;
while(person[i].parent!=i)
{
person[i].parent=person[person[i].parent].parent;
i=person[i].parent;
}
while(person[j].parent!=j)
{
person[j].parent=person[person[j].parent].parent;
j=person[j].parent;
}
if(i!=j)
{
if(person[i].nodenum>person[j].nodenum)
{
person[j].parent=i;
person[i].nodenum+=person[j].nodenum;
sum--;
}
else
{
person[i].parent=j;
person[j].nodenum+=person[i].nodenum;
sum--;
}
}
}
int main()
{
int n,m;
int first,second;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
person[i].parent=i,person[i].nodenum=1;
sum=n;
for(int i=0;i<m;i++)
{
scanf("%d%d",&first,&second);
merge(first,second);
}
printf("%d\n",sum);
}
return 0;
}