【构造】0617 Edge Split

2023-11-14

题意:

给定一个 n n n m m m 条边的无向连通图,其中 1 ≤ m ≤ n + 2 1\leq m\leq n+2 1mn+2 m m m 条边中有一些条边被染成红色,剩下的边被染成蓝色。只考虑红色边,有 c 1 c_1 c1 个连通分量。只考虑蓝色边,有 c 2 c_2 c2 个连通分量。请你给边进行染色,最小化 c 1 + c 2 c_1+c_2 c1+c2

数据范围: 2 ≤ n ≤ 2 × 1 0 5 , n − 1 ≤ m ≤ min ⁡ ( n + 2 , n × ( n − 1 ) 2 ) 2\leq n\leq 2\times 10^5,n-1\leq m\leq \min(n+2,\frac{n\times(n-1)}{2}) 2n2×105,n1mmin(n+2,2n×(n1))

题解:
一开始的思路是,先考虑一棵树,即 m = n − 1 m=n-1 m=n1 的情况。假设有 k k k 条红边, n − 1 − k n-1-k n1k 条蓝边。

对于 c 1 c_1 c1 ,一条红边相当于缩减一个连通分量
对于 c 2 c_2 c2 ,一条蓝边相当于缩减一个连通分量

可以看成两棵树,一共有 2 n 2n 2n 个连通分量, c 1 + c 2 = 2 n − k − ( n − 1 − k ) = n + 1 c_1+c_2=2n-k-(n-1-k)=n+1 c1+c2=2nk(n1k)=n+1

接下来扩展, m = n m=n m=n,此时必然有一个环,但是我们可以将其拆开看。

假设所在环长度为 l e n len len,颜色都是红色,对于蓝色来说,断掉红色边,就相当于这个环上至少有 l e n len len 个连通分量,如果将其中一条边修改为蓝色,那么对于红色来说,断掉蓝色边,由于是个环,连通分量数依旧不变,但是对于蓝色来说,断掉红色边,存在两个点是一个连通分量了,总体是减1的。但是如此,继续修改红色边为蓝色边,对于红色的连通分量就要增加1,对于蓝色的连通分量依旧是减少1,所以不变。

故可以得出结论,只要不存在环,就可以使得每条边都可以减少一个连通分量(不论是对于红色还是蓝色来说)

故可以先构造一棵生成树,全为红色。剩下 m − n + 1 m-n+1 mn+1 条边判断是否会构成环,如果不构成环,全部为蓝色,如果构成环,就把任意一条边染成红色,然后这条边的其中一个点的所有边都染成蓝色,如此,对于蓝色来说就是一条链+两端叶子,对于红色也不会成环了。(注意这里只能把这个边其中一个点对应的所有边都染成蓝色,否则可能会导致蓝色环)

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

void solve() {
    int n, m;
    cin >> n >> m;

    vector<vector<pair<int, int>>> g(n);
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        g[u].emplace_back(v, i);
        g[v].emplace_back(u, i);
    }

    int cycle = -1;
    int edge = -1;
    vector<int> ans(m);
    vector<int> vis(n, 0);
    set<int> S;
    function<void(int, int)> dfs = [&](int u, int fa) {
        vis[u] = 1;
        for (auto& [v, idx]: g[u]) {
            if (v == fa) continue;
            if (vis[v]) {
                ans[idx] = 0;
                edge = idx;
                cycle = v;
                S.insert(u);
                S.insert(v);
                continue;
            }
            ans[idx] = 1;
            dfs(v, u);
        }
    };

    dfs(0, -1);
    if (m == n + 2 && S.size() == 3) {
        for (auto& [v, idx]: g[cycle]) {
            if (edge == idx) ans[idx] = 1;
            else ans[idx] = 0;
        }
    }

    for (int u: ans) cout << u;
    cout << "\n";
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T = 1;
    cin >> T;
    while (T--) solve();

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【构造】0617 Edge Split 的相关文章

  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 格式说明符%02x

    我有一个简单的程序 include
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 数据结构:数组模拟队列

    实现一个队列 队列初始为空 支持四种操作 push x 向队尾插入一个数 x pop 从队头弹出一个数 empty 判断队列是否为空 query 查询队头元素 数组模拟队列 队列 先进先出 include
  • mysql注入语句说明

    判断闭合id 1 页面正常 id 1 页面不正常 id 1 页面恢复正常说明闭合是 id 1 页面正常 id 1 页面不正常 id 1 页面还是不正常说明闭合不是 如果这时id 1 页面恢复正常 说明闭合是 id 1 and 1 1id 1
  • 为何实现不了定时器DMA Burst传输?

    有人使用STM32F4系列开发产品 程序运行过程中需要不时地对外输出一串驱动脉冲 并要求这几串脉冲的频率可变 占空比固定 他想到使用基于STM32定时器的DMA BURST传输 具体点说 他期望不时地通过TIM3的CH1输出一串频率可变 占
  • 二叉树的基本概念及性质

    文章目录 一 基本概念 二 二叉树的种类 二叉树 满二叉树 完全二叉树 二叉搜索树 平衡二叉搜索树 三 二叉树的性质 性质一 性质二 性质三 性质四 性质五 一 基本概念 树是 n 个结点的有限集 在任意一颗非空树中 1 有且仅有一个特定的
  • window修改本地域名

    C Windows System32 drivers etc 127 0 0 1 bbs itcast com 127 0 0 1 mail itcast com 127 0 0 1 cas itcast cn 127 0 0 1 www
  • 简单理解promise

    promise是ES6为我们提供解决 回调地狱 的一种方法 能让代码的可读性更高 先看一个最简单的例子 new Promise function resolve reject executor 首先我们先new一个 Promise 对象时
  • 显示搜索dota2协调服务器,搜索dota2游戏协调服务器中【操作方式】

    喜欢使用电脑的小伙伴们一般都会遇到win7系统搜索dota2游戏协调服务器中的问题 突然遇到win7系统搜索dota2游戏协调服务器中的问题就不知道该怎么办了 其实win7系统搜索dota2游戏协调服务器中的解决方法非常简单 按照 1 DO
  • Hive 任务限制同时运行的任务数量的配置

    Hive任务的并发控制 指同时运行的 container 的数量 防止先提交的任务占用全部的队列资源 导致后来提交的任务无法申请到足够的资源 Hive 任务的并发控制 和使用的引擎相关 MapReduce MR 引擎 Map 任务 mr 引
  • 微信收钱的盒子服务器老是断开,微信文件已过期或被清理的终极解决办法

    工作中总是有同事习惯用微信传文件 当我们沿着微信对话爬楼找历史文件时 总会收到让人绝望的提醒 文件已过期或被清理 这里有个抢救办法 你不妨一试 如果文件当时是通过电脑发的 可以在 此电脑 文档 WeChat File 中找找 如果没有就真是
  • 基础数据结构之单循环链表

    文章目录 一 补充上节课的知识点 单链表和顺序表的区别 顺序表和单链表的使用场景分析 二 认识单循环链表 1 将单循环链表的增删改查用画图方式展现出来 2 用代码实现单循环链表 一 补充上节课的知识点 单链表和顺序表的区别 顺序表和单链表的
  • Qt中以qRegister开头的几个函数的用法说明

    目录 1 前言 2 qRegisterMetaTypeStreamOperators 2 1 函数功能简述 2 2 用法举例1 3 qRegisterMetaType 1 前言 Qt通过qRegister开头的函数和Q DECLARE开头的
  • 深度学习知识点一

    1 说说卷积和全连接网络的区别 2 什么是感受野呢 3 深度学习的 深度 是不是一昧的增加深度就好了吗 网络是否越深越好 4 减少过拟合的手段 5 简单的说一下YOLO V1 6 MobileNet 用到的模型压缩手段是什么 7 简单的说一
  • Java集合面试题 52道

    集合容器概述 什么是集合 集合就是一个放数据的容器 准确的说是放数据对象引用的容器 集合类存放的都是对象的引用 而不是对象的本身 集合类型主要有3种 set 集 list 列表 和map 映射 集合的特点 集合的特点主要有如下两点 集合用于
  • C51单片机--IO口应用

    流水灯 文章目录 流水灯 前言 一 D1到D8依次点亮 二 读入开关K1 K4的状态 按下对应开关 控制相应D1 D4灯亮 三 流水灯 功能 LED从左边起D1 D3亮 并闪烁3次 然后是D2 D4亮 并闪烁3次 然后D3 D5亮 闪烁3次
  • SQL面试题之区间合并问题

    目录 0 需求 1 数据准备 2 数据分析 2 小结 0 需求 给定多个时间段 每个时间段分为开始时间 结束时间 将相互重叠的多个时间段合并为一个区间 数据 id 开始时间 结束时间 1 12 15 2 57 58 3 29 32 4 30
  • JDK 监控和故障处理工具

    JDK 监控和故障处理工具总结 JDK 命令行工具 这些命令在 JDK 安装目录下的 bin 目录下 jps JVM Process Status 类似 UNIX 的 ps 命令 用户查看所有 Java 进程的启动类 传入参数和 Java
  • About the MariaDB Java Client

    https kb askmonty org en about the mariadb java client The MariaDB Client Library for Java Applications is used to conne
  • 配置systemctl命令tab自动补全 【转】

    文章来源 配置systemctl命令tab自动补全 系统版本 root test uname r 3 10 0 229 el7 x86 64 root test cat etc redhat release CentOS Linux rel
  • C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

    这里介绍俩种办法 方法一 直接通过修改窗体位置从而达到移动窗体的效果 方法二 直接伪装发送单击任务栏消息 让应用程序误以为单击任务栏从而移动窗体 方法一 1 定义一个位置信息Point用于存储鼠标位置 private Point mPoin
  • 【构造】0617 Edge Split

    题意 给定一个 n n n 点 m m m 条边的无向连通图 其中 1