28.染色

描述:

思想:
采用并查集的思想,使用vector容器保存最初始的对应关系,使用一个无序map表来进行合并操作。unordered_map<int, list>,其中key表示的是对应的元素值,value用一个list链表来保存对应的数组下标。

代码:

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

int main(){
    int n,q,x,y;
    cin >> n;
    vector<int> datas(n+1);
    unordered_map<int, list<int>> cnt;

    for(int i = 1;i <= n;i++){
        cin >> datas[i];
        cnt[datas[i]].push_back(i);
    }
    cin >> q;
    while(q--){
        cin >> x >> y;
        if(x == y) continue;
        // 合并
        cnt[y].splice(cnt[y].end(), cnt[x]);
    }
    for(auto [x,index] : cnt){
        for(auto i : index){
            // 更新,i表示的是数组的下标,x表示的最终更新后的数据值
            datas[i] = x;
        }
    }
    for(int i = 1;i<=n;i++){
        cout << datas[i] << " ";
    }
    return 0;
}
posted @ 2024-09-07 21:23  alone_qing  阅读(6)  评论(0)    收藏  举报