题意

一个 n 个点,m 条边的无向图,加边使无向图联通

题解

并查集板子题
使联通的两点union,最后得到x棵树,即无向图的x个连通子图,两两之间填一条边即可得答案为x-1

Code

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
int fa[maxn];                   //记录祖先节点

int fi(int x){                  //find函数寻找祖先
    return x == fa[x] ? x : fa[x] = fi(fa[x]);
}

void un(int x,int y){           //union函数建立两点关系
    int p = fi(x);
    int q = fi(y);
    if(p != q) fa[p] = q;
}

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i = 1;i <= n;++i) fa[i] = i;        //init
    for(int i = 0;i < m;++i){
        int u, v;
        scanf("%d %d",&u,&v);
        un(u,v);
    }

    int cnt = 0;
    for(int i = 1;i <= n;++i){
        if(fa[i] == i) cnt++;               //寻找树根 即子图个数
    }
    printf("%d\n",cnt-1);

    return 0;
}