hdu 1232
经典并查集
此题为典型的并查集应用,使用并查集合并操作将全部城镇分为N个集合,每个集合中的城镇相互连通,所以至少还需N-1条道路便可以将N个集合连通。
#include<stdio.h>
int father[1010];
void union_set(int n)
{
for (int i=1;i<=n;i++)
father[i]=i;
}
int find (int x)
{
if (x != father[x])
father[x]=find (father[x]);
return father[x];
}
void Union(int x,int y)
{
x=father[x];
y=father[y];
if (x!=y)
father[x]=y;
}
int main ()
{
int n,m,a,b;
while (scanf("%d",&n)&&n)
{ scanf ("%d",&m);
int total=n-1;
union_set (n);
while (m--)
{scanf ("%d%d",&a,&b);
if (find(a)!=find(b))/*连接a,b,需要建路的条数减1*/
{Union (a,b);
total--;
}
}
printf("%d\n",total);
}
return 0;
}