顺丰笔试、学术交流、并查集

之前从没有写过并查集,昨天顺丰笔试,见到其它老哥用并查集很容易就能解决了学术交流的问题。看了大佬ac的java代码,照着写了个c++的并查集。并查集还是挺有用的,在此记录一下,希望加深一下印象。
如有错误,敬请指出。

#include<bits/stdc++.h>
using namespace std;
int findparent(int a, vector<int> &parent) {
    int x = a;
    while(parent[x] != x) x = parent[x];
    while(parent[a] != x) {
        int z = a;
        a  = parent[a];
        parent[z] = x;
    }
    return x;
}

void uniontwo(int a, int b, vector<int> &parent) {
    int ap = findparent(a, parent), bp = findparent(b, parent);
    if(ap != bp) {
        parent[ap] = bp;
    }
}

int main() {
    int n,m,k;
    cin >> n >> m >> k;
    vector<int> parent(m);
    map<int, vector<int>> mp; // key is people, value is the man's languages
    vector<int> people2language(n, -1);
    vector<bool> show(m, false);
    for(int i = 0; i < m; i++) {
        parent[i] = i;
    }
    for(int i = 0; i < k; i++) {
        int people, language;
        cin >> people >> language;
        people2language[people-1] = language;
        if(mp.count(people) == 0) {
            mp[people] = vector<int>(1, language);
        }else{
            mp[people].push_back(language);
        }
        show[language-1] = true;
    }
    for(int i = 0; i < n; i++) {
        if(mp.count(i) > 0) {
            for(int j = 0; j < mp[i].size()-1; j++){
                uniontwo(mp[i][j], mp[i][j+1], parent);
            }
        }
    }
    int ans = 0;
    for(int i = 0; i < n; i++) {
        if(people2language[i] == -1) {
            ans++;
        }
    }
    set<int> st;
    for(int i = 0; i < m; i++) {
        if(show[i]) {
            st.insert(findparent(i, parent));
        }
    }
    if(st.size() > 0) {
        ans = ans + st.size()-1;
    }
    cout << ans << endl;
    return 0;
}
#笔试题目#
全部评论
Mark,之前也没写过并查集
点赞 回复 分享
发布于 2019-08-30 12:20
好多人内存爆了
点赞 回复 分享
发布于 2019-08-30 12:38
findparent没有返回值。。。。。。。
点赞 回复 分享
发布于 2019-08-31 16:51
show那不应该是show[language-1] = true么?
点赞 回复 分享
发布于 2019-08-31 17:32
对不住大家,没有编译就发上来了
点赞 回复 分享
发布于 2019-08-31 23:33
求楼主再发个能通过示例的修订版
点赞 回复 分享
发布于 2019-09-01 00:15
并查集蛮重要的, CVTE和字节跳动的笔试也出现过类似的。会并查集只需要20分钟出结果。
点赞 回复 分享
发布于 2019-09-06 13:48

相关推荐

评论
2
18
分享

创作者周榜

更多
牛客网
牛客企业服务