zoukankan      html  css  js  c++  java
  • 变形金刚

    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
    ", sum-1);
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    个人博客作业-软件案例分析
    个人项目
    个人博客作业
    软件工程作业一
    BUAAOO第四单元总结
    BUAAOO第三单元总结
    BUAAOO第二单元总结之电梯问题
    BUAAOO第一单元的总结
    个人总结
    第三次个人编程作业
  • 原文地址:https://www.cnblogs.com/titicia/p/4342059.html
Copyright © 2011-2022 走看看