multiset和树的dfs

multiset:

multiset 是 C++ 标准库中的一种容器,它存储一组元素,并保证这些元素按顺序排列。与 std::set 的区别在于,multiset 允许存储重复的元素,而 set 只存储唯一的元素。使用是multiset不能为空。

常用操作:

  1. 插入元素:使用 insert() 方法插入元素。

    cpp复制编辑std::multiset<int> ms;
    ms.insert(5);
    ms.insert(10);
    ms.insert(5);  // 插入重复的元素
    
  2. 删除元素:使用 erase() 方法删除元素。可以删除特定的元素,也可以删除某个位置的元素。

    ms.erase(5);  // 删除所有值为 5 的元素
    ms.erase(ms.find(10));  // 删除第一个值为 10 的元素
    //删除单个元素一般使用extract
    auto node = ms.extract(3);
    //删除元素并返回删除元素的迭代器
    
  3. 查找元素:使用 find() 方法查找某个元素的位置。

    auto it = ms.find(5);
    if (it != ms.end()) {
        // 找到元素
    }
    
  4. 访问元素:可以通过迭代器访问元素。

    for (auto it = ms.begin(); it != ms.end(); ++it) {
        std::cout << *it << " ";
    }
    
  5. 获取元素个数:使用 count() 方法获取某个元素出现的次数。

    int count = ms.count(5);  // 获取 5 出现的次数
    
  6. 获取最大和最小元素:可以通过 begin()rbegin() 来访问最小和最大元素。

    int min_val = *ms.begin();      // 最小元素
    int max_val = *ms.rbegin();     // 最大元素
    

例题:https://codeforces.com/contest/2114/problem/D

树的dfs:

​ 树的邻接表存储

 vector<vector<ll>> adj(n + 1);
        for (int i = 1; i <= n - 1; i++)
        {
            ll u, v;
            cin >> u >> v;
            adj[u].push_back(v);
            adj[v].push_back(u);
        }

树的dfs

auto dfs = [&](auto& self, int u, int fa) -> void {
    vis[u] = true;
    for (int v : g[u]) {
        if (vis[v]) continue;
        fat[v] = u;  
        self(self, v, u);  
    }
};
dfs(dfs,1,0)

例题:https://codeforces.com/contest/2114/problem/E

posted @ 2025-06-12 11:37  cloudbless  阅读(19)  评论(0)    收藏  举报