题解:AT_joisc2007_fiber 光ファイバー (Fiber)

· · 题解

思路:

这一题要问至少要加多少边才能使图联通。为了加的变最少,我们容易想到把原来图中所要的联通块连接在一起,这时答案就是联通块数减 1,用并查集维护一下就行了。

代码:

#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,m,f[30005];
int find(int x){
    if(f[x]==x) return x;
    return f[x]=find(f[x]);
}
void u(int a,int b){
    f[find(a)]=find(b);
}
signed main(){
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<30005;++i) f[i]=i;
    int ans=-1;
    while(m--){
        int a,b;cin>>a>>b;
        u(a,b);
    }
    for(int i=1;i<=n;++i){
        if(f[i]==i) ++ans;
    }
    cout<<ans<<'\n';
    return 0;
}