HDU1232 畅通工程 并查集

时间:2023-02-11 09:54:00

这题是并查集的简单运用。我所利用的并查集没有经过优化。只用到了初始化(每个元素都是一个集合)、查找(某个

元素所在的集合,集合以根节点标志)、合并(两集合不属于同一集合则合并)

这题的主要思想在于:找出连通分量的个数。减一之后就是所求最小需要添加的路径数。而利用并查集时可以发现连通

分量的个数等于父节点为自身的节点数目。

 

AC代码:

#include<iostream>
using namespace std;

const int MAX=1000;
int father[MAX];

void initial(int n) //初始化
{
for(int i=1;i<=n;i++)
father[i]=i;
}

int find(int x) //查找
{
while(father[x]!=x)
x=father[x];

return x;
}

void combine(int a,int b) //合并
{
int tmpa=find(a);
int tmpb=find(b);

if(tmpa!=tmpb)
father[tmpa]=tmpb;
}

int main()
{
int i,n,m,a,b,tmp;

while(cin>>n,n)
{
initial(n);

cin>>m;

for(i=1;i<=m;i++)
{
cin>>a>>b;
combine(a,b);
}

tmp=0;
for(i=1;i<=n;i++) //确定连通分量个数
{
if(father[i]==i)
tmp++;
}

cout<<tmp-1<<endl;
}

return 0;
}