变形金刚

Description

有一天Stubird买了一台变形金刚,店员说,这台变形金刚和其他那种骗小孩子的不一样 他真的能变形。 这台变形金刚有n个部件,他们能互相连接,组成机器人,当然,也可以变形。 但是有一天,The tesseract 的能量突然消失了,部件散落一地,当然有些部件还连接着。 现在你只有把部件全部连接起来,他就能变回原样,例如,有4个部件,1,2是连接的,3,4也是连接着的 ,你只需要把1和3连接起来(1,4或者2,3或者2,4)他就能变回原样啦。 他现在问你最少需要多少次连接才能把它变回原样?

Input

第一行一个T,表示有T个测试样例 接下来一个n和m(n<=10^5,0<=m<=10^5),n表示部件个数,m表示有多少个部件还连接着 下面m行,每行u,v表示部件u,v是连接着的。(1<=u,v<=n)

Output

求最小的连接次数

Sample Input

2 1 0 5 2 1 2 3 4

Sample Output

0 2

HINT

并查集,求最少需要多少条路把分块连起来。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <string>
 5 #include <algorithm>
 6 using namespace std;
 7 int n, m, T;
 8 #define maxn 100010
 9 int pre[maxn];
10 int find(int x){
11     if(x == pre[x]) return pre[x];
12     else return find(pre[x]); 
13 }
14 int main(){
15     scanf("%d", &T);
16     while(T--){
17         scanf("%d%d", &n, &m);
18         for(int i = 1; i <= n; i++) pre[i] = i;
19         for(int i = 1; i <= m; i++){
20             int u, v, uu ,vv;
21             scanf("%d%d", &u, &v);
22             uu = find(u);
23             vv = find(v);
24             if(uu != vv){
25                 pre[uu] = vv;
26             }
27         }
28         int sum = 0;
29         for(int i = 1; i <= n; i++){
30             if(pre[i] == i) sum++;
31         }
32         printf("%d\n", sum-1);
33     }
34     return 0;
35 }

 

posted @ 2015-03-16 16:02  下周LGD该赢了吧  阅读(215)  评论(0编辑  收藏  举报