连通网络
Time Limit: 1000MS Memory limit: 65536K
题目描述
网络由基站和基站间线路组成,基站连通表示两个基站可以通过线路互相到达。网络连通代表网络中任意两基站可以互相连通。现有一些网络,求这些网络至少增加多少线路成为连通网络。
输入
第一行输入一个数T代表测试数据个数(T<=20)。每个测试数据第一行2个数n,m 分别代表网络基站数和基站间线路数。基站的序号为从1到n。接下来m行两个数代表x,y 代表基站x,y间有一条线路。
(0<n<=1000000, 0<=m <=10000,1<=x,y<=n )
输出
对于每个样例输出最少增加多少线路可以成为连通网络。每行输出一个结果。
示例输入
2 3 1 1 2 3 2 1 2 2 3
示例输出
1 0//利用并查做的题目:判断不连通的个数 #include<iostream> #include<cstdio> #define MAX 1001000 int farther[MAX]; int rank[MAX]; int check[MAX]; int find(int x) { if(farther[x]==x) return x; farther[x]=find(farther[x]); return farther[x]; } void unit(int x,int y) { int rx=find(x); int ry=find(y); if(rx==ry) return ; if(rank[rx]>rank[ry]) { farther[ry]=rx; } else { farther[rx]=ry; if(rank[ry]==rank[rx]) rank[ry]++; } } int main() { int a,b; int aa,bb; int x,y; int ans1,ans2,step=1,res,people; int sum; scanf("%d",&sum); while(sum--) { ans1=0; scanf("%d%d",&a,&b); for(int i=1; i<=MAX; i++) { farther[i]=i; rank[i]=0; check[i]=0; } for(int j=0; j<b; j++) { scanf("%d%d",&x,&y); unit(x,y); } int s; for(int j=1; j<=a; j++) { s=find(j); if(s==j) { ans1++; } } printf("%d\n",ans1-1); } return 0; }