点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include <stdio.h>
#define M 1010
int par[M];
int find(int x)
{
int k,t,y;
k=x;
while(par[x]!=x)
{
x=par[x];
}
while(k!=x) //路径压缩
{ // 把所有的中间节点 加入到根节点的直接后继
y=par[k];
par[k]=x;
k=y;
}
return x;
}
void join(int a,int b)
{
int x,y;
x=find(a);
y=find(b);
par[y]=x; //老大合并
}
int main()
{
int n,e,a,b,i,ans,x,y;
while(scanf("%d",&n)&&n)
{
scanf("%d",&e);
ans=0;
for(i=1;i<=n;i++)
{
par[i]=i;
}
while(e--)
{
scanf("%d%d",&a,&b);
join(a,b);
}
for(i=1;i<n;i++)
{
if(find(i)!=find(i+1))
{
ans++;
join(i,i+1);
}
}
printf("%d\n",ans);
}
return 0;
}