题目链接: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(); }