加边的无向图

加边的无向图

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

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

}
全部评论

相关推荐

不愿透露姓名的神秘牛友
04-16 16:26
我的工资够买几件上千的衣服?是时候反思了
菜鸟CV程序猿:国内这都不是老板,是奴隶主
点赞 评论 收藏
分享
ALEX_BLX:虽然说聊天记录不可信,不过这个趋势确实如此但我觉得也要想到一点就是卷后端的人里真正有“料”的人又有多少,我说的这个料都不是说一定要到大佬那种级别,而是就一个正常的水平。即使是现在也有很多人是跟风转码的,2-3个月速成后端技术栈的人数不胜数,但今时不同往日没可能靠速成进大厂了。这种情况就跟考研一样,你能上考场就已经打败一半的人了
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务