找出无向图中的各个子图

1.题目:

输入:map<int,set> mp;
key是集合主键,value是集合元素
mp[1]={1,2,3};
mp[2]={1,3,5};
mp[3]={2,6,7};
mp[4]={1,2,7};
mp[5]={11,12,13};
mp[6]={11,12,13};
mp[7]={21,22,23};

输出:最大连通子图序列
[1,2,3,4],[5,6],[7]

2.解决一:

#include <iostream>
#include<algorithm>
#include <vector>
#include <stack>
#include <set>
#include <map>
using namespace std;

using PIV = pair<int, vector<int>>;
vector<PIV> tree;

int find(int val) {
    
    
    int root = val;
    while (root != tree[root].first) {
    
    
        root = tree[root].first;
    }
    while (root != val) {
    
     
        val = tree[val].first;
        tree[val].first = root;
    } //路径压缩
    return val;
}

void merge(int a, int b) {
    
    
    int roota = find(a);
    int rootb = find(b);
    tree[roota].first = rootb;
}

int main() {
    
    
    tree.resize(23 + 1);
    for (int i = 0; i < tree.size(); ++i) {
    
    
        tree[i] = {
    
     i, {
    
    } };
    }

    map<int, vector<int>> mp;
    mp[1] = {
    
     1,2,3 };
    mp[2] = {
    
     1,3,5 };
    mp[3] = {
    
     2,6,7 };
    mp[4] = {
    
     1,2,7 };
    mp[5] = {
    
     11,12,13 };
    mp[6] = {
    
     11,12,13 };
    mp[7] = {
    
     21,22,23 };

    for (auto& kv : mp) {
    
    
        vector<int>& temp = kv.second;
        if (temp.size() == 0) continue;
        tree[temp[0]].second.emplace_back(kv.first);
        for (int i = 1; i < temp.size(); ++i) {
    
    
            tree[temp[i]].second.emplace_back(kv.first);
            merge(temp[i - 1], temp[i]);
        }
    }

    map<int, set<int>> ans;
    for (auto& ele : tree) {
    
    
        if (ele.second.size())
            ans[find(ele.first)].insert(ele.second.begin(), ele.second.end());
    }

}

3.解决二:

#include <iostream>
#include<algorithm>
#include <vector>
#include <stack>
#include <set>
#include <map>
using namespace std;

using PIS = pair<int, set<int>>;
unordered_map<int, PIS> tree;

int find(int val) {
    
    
    if (tree.find(val) == tree.end()) {
    
    
        //tree[val] = {};
    }
    else {
    
    
        int root = val;
        while (root != tree[root].first) {
    
    
            root = tree[root].first;
        }
        while (root != val) {
    
    
            val = tree[val].first;
            tree[val].first = root;
        } //路径压缩
    }
    return val;
}

void merge(int a, int b) {
    
    
    int roota = find(a);
    int rootb = find(b);
    tree[roota].first = rootb;
}

int main() {
    
    
    map<int, vector<int>> mp;
    mp[1] = {
    
     1,2,3 };
    mp[2] = {
    
     1,3,5 };
    mp[3] = {
    
     2,6,7 };
    mp[4] = {
    
     1,2,7 };
    mp[5] = {
    
     11,12,13 };
    mp[6] = {
    
     11,12,13 };
    mp[7] = {
    
     21,22,23 };

    for (auto& kv : mp) {
    
    
        vector<int>& temp = kv.second;
        if (temp.size() == 0) continue;
        tree[temp[0]].second.insert(kv.first);
        if (tree[temp[0]].first == 0)tree[temp[0]].first = temp[0];
        for (int i = 1; i < temp.size(); ++i) {
    
    
            tree[temp[i]].second.insert(kv.first);
            if (tree[temp[i]].first == 0)tree[temp[i]].first = temp[i];
            merge(temp[i - 1], temp[i]);
        }
    }

    map<int, set<int>> ans;
    for (auto& ele : tree) {
    
    
        //if (ele.second.second.size())
            ans[find(ele.second.first)].insert(ele.second.second.begin(), ele.second.second.end());
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43202635/article/details/109135658