CF1559D1. Mocha and Diana (Easy Version)
时间:2021-08-16
本文章向大家介绍CF1559D1. Mocha and Diana (Easy Version),主要包括CF1559D1. Mocha and Diana (Easy Version)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原题链接: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(x)] += Size[find(y)];
fa[find(x)] = find(y);
}
bool check(int x, int y) {
return find(x) == find(y);
}
}dsu1, dsu2;
原文地址:https://www.cnblogs.com/ZhengLijie/p/15146455.html
- SQL 行列转换简单示例
- SQLSERVER 2012计算上一条,下一条数据的函数
- 使用命名管道实现进程间通信
- 获取SqlServer存储过程定义的3种方法
- 【自然框架】开源社区活动,会员注册的第一份代码!
- CentOS 7 安装Mono 和 MonoDevelop
- 【自然框架】注册会员活动——第一份代码的修改建议(第一版)
- 【视频】自然框架之分页控件的使用方法(一) PostBack方式的一般分页方式
- Java中的Socket编程学习
- 【视频】自然框架之分页控件的使用方法(二) 下载、DLL说明和web.config的设置
- Jsp开发中遇到的中文乱码问题及解决方法
- 开发中最常见的Java字符串问题总结
- .net异步性能测试(包括ASP.NET MVC WebAPI异步方法)
- Java 8的函数式编程学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Thinkphp5框架实现图片、音频和视频文件的上传功能详解
- Android使用Opengl录像时添加水印
- Laravel使用Queue队列的技巧汇总
- Thinkphp5框架ajax接口实现方法分析
- android MediaRecorder实现录屏时带录音功能
- php根据地址获取百度地图经纬度的实例方法
- Android 代码一键实现银行卡绑定功能
- Android 通过cmake的方式接入opencv的方法步骤
- Yii框架响应组件用法实例分析
- Android开发学习实现简单计算器
- Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
- Android 8.1隐藏状态栏图标的实例代码
- Android制作登录页面并且记住账号密码功能的实现代码
- Yii框架分页技术实例分析
- PHP命名空间与自动加载机制的基础介绍