题目描述
网络由基站和基站间线路组成,基站连通表示两个基站可以通过线路互相到达。网络连通代表网络中任意两基站可以互相连通。现有一些网络,求这些网络至少增加多少线路成为连通网络。
输入
第一行输入一个数T代表测试数据个数(T<=20)。每个测试数据第一行2个数n,m 分别代表网络基站数和基站间线路数。基站的序号为从1到n。接下来m行两个数代表x,y 代表基站x,y间有一条线路。
(0 <= n, m <= 1000000)
输出
对于每个样例输出最少增加多少线路可以成为连通网络。每行输出一个结果。
示例输入
2 3 1 1 2 3 2 1 2 2 3
示例输出
1 0
#include <stdio.h>
#include <string.h>
int pre[10000000];
int find(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];
return r;
}
void join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
pre[fx]=fy;
}
int main()
{
int t,n,m,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
int total=n-1;
for(int i=1;i<=n;i++)
pre[i]=i;
for(int j=1;j<=m;j++)
{
scanf("%d %d",&a,&b);
join(a,b);
}
for(int i=1;i<=n;i++)
{
if(pre[i]!=i)
total--;
}
printf("%d\n",total);
}
return 0;
}