http://acm.hdu.edu.cn/showproblem.php?pid=1232
分析:
找到有几个单独的连通区域 就知道要修几条路了
AC代码:
#include <stdio.h>
int pre[1005];
int find(int x){
int r=x;
while (pre[r]!=r){
r=pre[r];
}
int i=x;
int temp;
while (i!=r){
temp=pre[i];
pre[i]=r;
i=temp;
}
return r;
}
void join(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy){
pre[fx]=fy;
}
}
int main (){
int n,m;
while (scanf ("%d%d",&n,&m)&&n){
int a,b;
for (int i=1;i<=n;i++){
pre[i]=i;// 初始化
}
for (int i=0;i<m;i++){
scanf ("%d%d",&a,&b);
join(a,b);
}
int sum=0;
for (int i=1;i<=n;i++){
if(find(i)==i)// 有多少的根节点(即有多少连通区域)
sum++;
}
printf ("%d\n",sum-1);// 修路条数等于连通区域减一
}
return 0;
}