题目描述:

链接:https://ac.nowcoder.com/acm/problem/14685

给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~

输入描述:

第一行两个正整数 n 和 m 。接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。

输出描述:
输出一个整数,表示答案

数据范围:对于100%的数据,有n,m<=100000。

solution:

先将已有的边通过并查集形成一棵最小生成树
再找出树中已有的一个点与其它点进行比较,判断是否在树中,不在则进行合并操作

#include<bits/stdc++.h>
using namespace std;
int n,m,f[100005],s=0,u,v;
int f1(int x)
{
    return f[x]==x?x:f[x]=f1(f[x]);
}
void Union(int x,int y)
{
    int u=f1(x),v=f1(y);
    f[u]=v;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        f[i]=i;
    for(int i=0;i<m;i++)
    {
        cin>>u>>v;
        if(f1(u)!=f1(v))
            Union(u,v);
    }
    int k=0;
    for(int i=1;i<=n;i++)
    {
        if(f[i]!=i)
        {
            k=i;
            break;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(f1(i)!=f1(k))
        {
            Union(i,k);
            s++;
        }
    }
    cout<<s;
}