原题链接: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. js中的函数式编程

    函数是javascript中非常重要的一部分,用途也非常的多,可作为参数.返回值.回调等等,下面有一些函数式编程的重要概念和定义 纯函数 纯函数属于程序设计的名词,其它语言中也是存在的,而在javas ...

  2. LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  3. Pytest+Jenkins 学习笔记

    Pytest+Jenkins 学习笔记 在软件测试工作中,单元测试通常是由开发人员执行的.针对最小单元粒度的组件测试,在完成了单元粒度的测试任务之后,通常就需要交由专职的测试人员将这些单元级的组件放到 ...

  4. 《最新出炉》系列入门篇-Python+Playwright自动化测试-15-playwright处理浏览器多窗口切换

    1.简介 浏览器多窗口的切换问题相比大家不会陌生吧,之前宏哥在java+selenium系列文章中就有介绍过.大致步骤就是:使用selenium进行浏览器的多个窗口切换测试,如果我们打开了多个网页,进 ...

  5. DevOps |研发效能之环境、程序、配置、SQL变更管理

    本文主要是讲如何建立有效的环境.程序.配置.SQL变更和管理平台. ​几天前和一个朋友聊到环境.程序的配置变更,SQL变更和整个上线流程.之前我们在这块也做了很多,有做的好的也有做的一般的,借机都总结 ...

  6. jQuery提交表单

    $('#myform').form('submit',{ url: "login.action", onSubmit:function(){ return $('#myform') ...

  7. Maven安装与配置教程

    一.安装前检查 检查电脑上是否安装JDK,如果没有安装,请查看JDK安装教程:点我查看 如果电脑上已经安装JDK,按Win 和R键,输入cmd,然后点击确定 输入java -version,点击回车, ...

  8. No manual entry for ls终极解决办法

    No manual entry for ls解决办法,最后一种方法一定能解决你的问题 步骤一:确认man是否已经安装 #which man /usr/bin/man---返回此行,证明已经安装 步骤二 ...

  9. 聊聊wireshark的进阶使用功能

    1. 前言 emmm,说起网络知识学习肯定离不来wireshark工具,这个工具能够帮助我们快速地定位网络问题以及帮助正在学习网络协议这块的知识的同学验证理论与实际的一大利器,平时更多的只是停留在初步 ...

  10. Vue2系列(lqz)——6-Vue-cli、7-Vue插件、8-Vue第三方框架之ElementUi

    文章目录 6 Vue-CLI 项目搭建 1 单文件组件 2 Vue-CLI 项目搭建 2.1 环境搭建 2.2 项目的创建 创建项目 启动/停止项目 打包项目 package.json中 2.3 认识 ...