题目链接:https://ac.nowcoder.com/acm/problem/14685
看题目好像是图论? 不存在的 ,吓唬你一下而已。
这就是简单的并查集,用到的也是并查集最常规的find 和merge(合并) 操作而已
在并查集基础上我用了集合,将各个不同的区域网放入了集合中,可能用不着set,但是用了更清楚,更好理解。
话不多说,细节和详情看代码,注释写的很清楚哦!

#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define ll long long
using namespace std;
#define close_stdin  ios::sync_with_stdio(false)
const int maxn=100005;
int fa[maxn];
int n, m;
set<int>st;
//并查集常用操作 merge 与find
int find(int x) {  
    return(fa[x]==x?x:fa[x]=find(fa[x]));
}
void merge(int x, int y) { //将x 和y连通到一个区域网内
    fa[find(x)] = find(y);
}
//void my_input(void) {
//
//}
void solve(void) {
    cin >> n >> m;
    for (int i = 1;i <= n;i++) { fa[i] = i; }  //先使n个互相独立
    for (int i = 1;i <= m;i++) { // 将各个相关的点连通
        int x, y;
        cin >> x >> y;
        merge(x, y);//将x点和y点连通
    }
    for (int i = 1;i <= n;i++) {
        st.insert(find(i));        //将每个点对应的区域网放入集合中,如果来自同一区域网则集合不变
    }
    cout << st.size()-1;  //n个区域网只需要n-1 条线 即可连起来 
}
int main() {
    close_stdin;//只是为了让cin和printf一样快
    solve();

}