当前位置: 首页 > article >正文

cf div3 998 E(并查集)

E :
给出两个简单无向图 (没有重边和自环)f g .
可以对f 进行 删边 和加边 的操作。问至少操作多少次 ,使得 f 和 g 的 点的联通情况相同(并查集的情况相同)

首先思考删边 :
对于 我 f 图存在边 e ,只要这个边 所连接的两个点 在g 中是不联通的,那么这条边一定要删除。

现在的问题是,所有要删的边 都删除了吗》答案是 Yes.
对于两个点 a b ,如果他们之间联通但不是直接通过 直接的一条边。那么我path 中的边,一定在我遍历e 的时候,删掉了。

所以到现在为止 删边的操作 已经完成了。
现在考虑加边的操作:
加边的数量 可以通过 连通块的数量的差值 直接计算。

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
struct DSU {
    vector<int> p, siz;

    DSU(int n) : p(n + 1), siz(n + 1, 1) {
        iota(p.begin(), p.end(), 0);
        // 会将容器 p 中的元素依次赋值为 0, 1, 2, 3, ...,直到填满整个范围。
    }

    int find(int x) {
        while (x != p[x]) x = p[x] = p[p[x]]; // 路径压缩
        return x;
    }

    bool same(int x, int y) {
        return find(x) == find(y);
    }

    bool uno(int x, int y) {
        x = find(x), y = find(y);
        if (same(x, y)) return false;
        siz[x] += siz[y];
        p[y] = x;
        return true;
    }

    int size(int x) {
        return siz[find(x)];
    }
};
void solve()
{
    int n,m1,m2;cin>>n>>m1>>m2;
    int u,v;
    vector<PII>e1(m1);
    for (int i=0;i<m1;i++)
    {
        cin>>e1[i].first>>e1[i].second;
    }
    DSU dsu1(n),dsu2(n);
    for (int i=0;i<m2;i++)
    {
        cin>>u>>v;
        dsu2.uno(u,v);
    }
    int res=0;
    for (auto [u,v]:e1)
    {
        if (!dsu2.same(u,v))
        {
            res++;
        }
        else dsu1.uno(u,v);
    }
    int siz1=0,siz2=0;
    for (int i=1;i<=n;i++)
    {
        siz1+= dsu1.find(i)==i;
        siz2+= dsu2.find(i)==i;
    }
    res+=siz1-siz2;
    cout<<res<<"\n";
}
int main()
{
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int t = 1;
     cin>>t;
    while (t--)
    {
        solve();
    }
    return 0;
}


http://www.kler.cn/a/531016.html

相关文章:

  • 【产品经理学习案例——AI翻译棒出海业务】
  • Windows图形界面(GUI)-QT-C/C++ - QT Stacked Widget
  • EtherCAT主站IGH-- 49 -- 搭建xenomai系统及自己的IGH主站
  • RDP协议详解
  • 【react+redux】 react使用redux相关内容
  • 在 Ubuntu 中使用 Conda 创建和管理虚拟环境
  • 几种用户鉴权的方式对比
  • Kamailio、MySQL、Redis、Gin后端、Vue.js前端等基于容器化部署
  • 讲清逻辑回归算法,剖析其作为广义线性模型的原因
  • volatile变量需要减少读取次数吗
  • 49【服务器介绍】
  • 常见的 Vue.js 组件库:Element Plus, Vuetify, Quasar
  • NeuralCF 模型:神经网络协同过滤模型
  • docker pull Error response from daemon问题
  • [HOT 100] 2824. 统计和小于目标的下标对数目
  • FreeRTOS从入门到精通 第十九章(内存管理)
  • 【大数据技术】教程05:本机DataGrip远程连接虚拟机MySQL/Hive
  • 《tcp/ip协议详解》,tcp/ip协议详解
  • Vue-data数据对象
  • 列表的简介
  • 新月军事战略分析系统使用手册
  • Linux中的基本指令(二)
  • Deep Crossing:深度交叉网络在推荐系统中的应用
  • 洛谷 P8724 [蓝桥杯 2020 省 AB3] 限高杆
  • 深入理解Java虚拟线程的同步编程模型
  • C++泛型编程指南09 类模板实现和使用友元