原题链接:1559D1. Mocha and Diana (Easy Version)

题意:

小明和小红各有一个具有\(n\)个结点的森林,现执行操作:

  • 加一条边,使得两人的森林还是森林
  • 小明加一条\((u, v)\)的边,那么小红也必须加一条\((u, v)\)的边。

    问我们最多能加多少边?

思路:

很明显,第一个条件没啥用,关键是第二个条件,我们知道如果一个人不能加\((u, v)\)一条边的前提条件是\(u\)与\(v\)已经联通,那么根据这个条件,我们可以使用并查集,而边的数据范围是\([1-1000]\),所以可以直接暴力枚举点,然后使用并查集来判断两个点是否已经在一个集合内,如果在一个集合内那么就不能加边了,否则加上即可。

#include <bits/stdc++.h>

using namespace std;

const int N = 1010;
int fa1[N], fa2[N]; int find1(int x) {
if (x != fa1[x]) fa1[x] = find1(fa1[x]);
return fa1[x];
} int find2(int x) {
if (x != fa2[x]) fa2[x] = find2(fa2[x]);
return fa2[x];
} int main() {
ios::sync_with_stdio(false), cin.tie(0); int n, m1, m2;
cin >> n >> m1 >> m2;
for (int i = 1; i <= n; i++) fa1[i] = i, fa2[i] = i;
while (m1--) {
int a, b;
cin >> a >> b;
fa1[find1(a)] = find1(b);
} while (m2--) {
int a, b;
cin >> a >> b;
fa2[find2(a)] = find2(b);
} vector<pair<int, int>> add;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
int u1 = find1(i), v1 = find1(j);
int u2 = find2(i), v2 = find2(j);
if (u1 != v1 && u2 != v2) {
add.push_back({i, j});
fa1[u1] = v1;
fa2[u2] = v2;
}
}
} cout << add.size() << endl;
for (int i = 0; i < add.size(); i++)
cout << add[i].first << " " << add[i].second << endl; return 0;
}

注意:

题目思路并不难,但是我耗了一个多小时,原因:

我一开始\(find\)函数写成了这样。

int find1(int x) {
if (x == fa1[x]) return x;
return find1(fa1[x]);
}

乍一看没错,确实没错,就是\(T\)到飞起,为啥,因为没有加入路径压缩的优化,所以\(T\)到飞起,我服了,这次长记性了。

另外,以后并查集用一个类吧,贴个板子:

struct DSU{
int fa[N], Size[N];
void init() {
for (int i = 1; i <= n; i++) fa[i] = i;
}
int find(int x) {
if (x != fa[x]) fa[x] = find(fa[x]);
return fa[x];
}
void merge(int x, int y) {
Size[find(y)] += Size[find(x)];
fa[find(x)] = find(y);
}
bool check(int x, int y) {
return find(x) == find(y);
}
}dsu1, dsu2;

CF1559D1. Mocha and Diana (Easy Version)的更多相关文章

  1. CF1559D2 Mocha and Diana (Hard Version)

    考虑到加树边每次最多只导致一对联通块之间的状态. 所以我们以任意顺序加入当前的合法边. 我们考虑先加入所有可加的\((1,a)\) 然后统计只在\(A\)中与1连的点,\(B\)中与2连的点. 则他们 ...

  2. Ping-Pong (Easy Version)(DFS)

    B. Ping-Pong (Easy Version) time limit per test 2 seconds memory limit per test 256 megabytes input ...

  3. ZOJ 3868 - Earthstone: Easy Version

    3868 - Earthstone: Easy Version Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld ...

  4. Codeforces 1077F1 Pictures with Kittens (easy version)(DP)

    题目链接:Pictures with Kittens (easy version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:$dp[i][j ...

  5. UVA12569-Planning mobile robot on Tree (EASY Version)(BFS+状态压缩)

    Problem UVA12569-Planning mobile robot on Tree (EASY Version) Accept:138  Submit:686 Time Limit: 300 ...

  6. Coffee and Coursework (Easy version)

    Coffee and Coursework (Easy version) time limit per test 1 second memory limit per test 256 megabyte ...

  7. 2016级算法第六次上机-B.ModricWang's FFT : EASY VERSION

    1114 ModricWang's FFT EASY VERSION 思路 利用FFT做大整数乘法,实际上是把大整数变成多项式,然后做多项式乘法. 例如,对于\(1234\),改写成\(f(x)=1* ...

  8. Saving James Bond - Easy Version (MOOC)

    06-图2 Saving James Bond - Easy Version (25 分) This time let us consider the situation in the movie & ...

  9. Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】

    任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...

  10. Codeforces Round #540 (Div. 3) D1. Coffee and Coursework (Easy version) 【贪心】

    任意门:http://codeforces.com/contest/1118/problem/D1 D1. Coffee and Coursework (Easy version) time limi ...

随机推荐

  1. Powe AutoMate: 条件判断语句

    大纲 学习使用条件判断语句 使用条件判断 功能描述 判断用户输入的年龄,并显示对应的信息 使用if 判断是否是未成年人: 使用else if 判断大于18岁,小于28岁的人群 运行效果 使用else ...

  2. MySQL8_SQL语法

    MySQL8_SQL语法 SQL 全称 Structured Query Language,结构化查询语言.操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 . 一.SQL通用语法 在学 ...

  3. VictoriaLogs:一款超低占用的 ElasticSearch 替代方案

    背景 前段时间我们想实现 Pulsar 消息的追踪流程,追踪实现的效果图如下: 实现其实比较简单,其中最重要的就是如何存储消息. 消息的读取我们是通过 Pulsar 自带的 BrokerInterce ...

  4. 论文解读(PERL)《PERL: Pivot-based Domain Adaptation for Pre-trained Deep Contextualized Embedding Models》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:PERL: Pivot-based Domain Adaptation for Pre-trained D ...

  5. 利用RATF框架实现web状态的监控

    之前,我们已经说明了如何实现一个我们的接口测试框架RATF,当然这个框架不止可以用于管理我们的接口测试代码,我们还可以用他来对我们的web进行简单粗暴的监控. 原理: 1. 通过使用配置文件,对要监控 ...

  6. MapReduce核心概念及架构

    MapReduce简介 MapReduce常用于对大规模数据集(大于1TB)的并行运算,或对大数据进行加工.挖掘和优化等处理. MapReduce将并行计算过程高度抽象到了两个函数map和reduce ...

  7. Linux离线安装Mysql-5.7

    1.背景描述 在真实业务场景下,Linux服务器一般位于内网,所以无法直接访问互联网资源: 特别是安装数据库的Linux服务器,在网络方面的管控只会更加严格: 因此,需要提前下载好相关资源,再传输到内 ...

  8. package.json指南

    一.属性 name 定义项目的名称,不能以"."和"_"开头,不能包含大写字母 version 定义项目的版本号,格式为:大版本号.次版本号.修订号 descr ...

  9. 浅谈TCP协议的发生过程

    1. TCP协议 1.1 TCP协议的性质 面向连接的.可靠的.基于字节流 至于为什么面向连接,又为什么可靠,基于字节流的,等后面便可知道. 1.2 TCP协议栈收发数据的四个阶段 创建套接字 连接服 ...

  10. Vue2系列(lqz)——slot插槽 (内容分发)、2 transition过渡、3 生命周期、4 swiper学习、5 自定义组件的封装、6 自定义指令、7 过滤器

    文章目录 1 slot插槽 (内容分发) 1.1 基本使用 1.2 插槽应用场景1 1.3 插槽应用场景2 1.4 具名插槽 2 transition过渡 3 生命周期 4 swiper学习 5 自定 ...