加边的无向图

加边的无向图

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

明说是图,实际是并查集

题意是根据结点和边得个数可以得到图的个数,答案就是 (图的个数 - 1 )
根据样例
图片说明

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int f[maxn];

int find ( int x) {
    if ( x == f[x]) return x;
    return f[x] = find(f[x]);
}

int main()
{
    int n, m; cin >> n >> m;
    for ( int i = 0; i < n; i++) f[i] = i;
    for ( int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b; 
        int x = find(a);
        int y = find(b);
        if ( x != y) {
            f[y] = x;
        }
    }
    int ans = 0;
    for ( int i = 0; i < n; i++) {
        if ( f[i] == i) ans++;
    }
    cout << ans - 1;
    system("pause");
}

/*
把所有操作分开的代码
*/

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5;
int f[maxn];

int find ( int x) {  // 查找 + 路径压缩
    if ( x == f[x]) return x;
    return f[x] = find(f[x]);
}

void sset( int n) {  // 
    for ( int i = 0; i < n; i++) f[i] = i;
}

void merge ( int m) {  // 合并
    for ( int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b; 
        int x = find(a);
        int y = find(b);
        if ( x != y) {
            f[y] = x;
        }
    }
}

int main()
{
    int n, m; cin >> n >> m;
    sset(n);
    merge(m);
    int ans = 0;
    for ( int i = 0; i < n; i++) {
    if ( f[i] == i) ans++;
    }
    cout << ans - 1;
}
全部评论

相关推荐

等闲_:学校的事情,双非要付出别人1.5倍以上的努力的话,学院本想进大厂就要卷成人中龙凤,我见过学院本进大厂的有莆田学院的,一堆牌子加上顶级项目才卷进字节,如果还想走后端的话,得评估一下自己的卷度和能力的扩展度。如果只是以进大厂为目标那前端和测开是最好的选择,如果以当后端开发为目标,进大厂可能就要考虑一下了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
题目还是比较简单的,做了两道,应该能进面试吧
誓死效忠银行:欢愉值,燃料,好串数量吗
投递掌阅科技等公司10个岗位
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务