暢通工程
注意:兩個城市之間可以有多條道路相通,也就是說
3 3
1 2
1 2
2 1
這種輸入也是合法的
當N爲0時,輸入結束,該用例不被處理。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int par[1011];
bool flag[1011];
int fin(int a)//查找
{
int p=a;
while(p!=par[p])//查找父節點
{
p=par[p];
}
int x=a,y;
while(x!=par[x])//路徑壓縮
{
y=par[x];
par[x]=p;
x=y;
}
return p;
}
void join(int a,int b)//連接
{
int pa=fin(a);
int pb=fin(b);
if(pa!=pb)
{
par[pa]=pb;
}
}
int main()
{
int n,m;
while(~scanf("%d",&n)&&n!=0)
{
int a,b;
scanf("%d",&m);
for(int i=1;i<=n;i++)
{
par[i]=i;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
join(a,b);
}
memset(flag,0,sizeof(flag));
int ans=0;
for(int i=1;i<=n;i++)
{
int p=fin(i);
if(flag[p]==0)
{
flag[p]=1;
ans++;
}
}
printf("%d\n",ans-1);
}
return 0;
}