IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> D2. Mocha and Diana (Hard Version) (并查集+思维) -> 正文阅读

[开发测试]D2. Mocha and Diana (Hard Version) (并查集+思维)

PS:这题官方好像给的要启发式合并?代码太长了感觉有点劝退,其实这题可以有更简单的做法。除了这个做法,好像还有大佬用随机化过的,我没看懂,但我大受震撼,ORZ

题解:首先当两个点不在同一棵树内时我们一定可以连条边,这就是并查集的合并。最后我们连的边一定是连到了一棵树上,我们先固定这棵树,将所有可以连的树全部连到1这个树上(当且仅这个点所在的两片森林中都不在这棵树上时才连)。然后剩下还没连到这棵棵树上的点在两片森林中只有一种情况,即一个连了一个没连。这时候连森林1的和以直接连森林2的点连(画图显而易见),我们用两个set分别记录这些点,然后直接连就行。说的有点模糊,具体见代码。
AC代码:

#include <iostream>
#include <cstring>
#include <vector>
#include <set>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=1e6+5;
int n,m1,m2;
int p1[N],p2[N];

int find(int p[],int x){
	if(p[x]!=x) return p[x]=find(p,p[x]);
	return p[x];
}

void merge(int p[],int a,int b){
	p[find(p,a)]=find(p,b);
}

bool same(int p[],int a,int b){
	return find(p,a)==find(p,b);
}

int main(){
	cin>>n>>m1>>m2;
	for(int i=0;i<=n+10;i++)p1[i]=i,p2[i]=i;
	while(m1--){
		int a,b;
		cin>>a>>b;
		merge(p1,a,b);
	}
	while(m2--){
		int a,b;
		cin>>a>>b;
		merge(p2,a,b);
	}
	
	vector<PII>ans;
	for(int i=2;i<=n;i++){
		if(!same(p1,1,i)&&!same(p2,1,i))
		{
			ans.push_back({1,i});
			merge(p1,1,i);
			merge(p2,1,i);
		}
	}
	
	set<int>s1,s2;
	for(int i=2;i<=n;i++){
		if(!same(p1,1,i)) s1.insert(find(p1,i));
		if(!same(p2,1,i)) s2.insert(find(p2,i));
	}
	
	for(auto a=s1.begin(),b=s2.begin();a!=s1.end()&&b!=s2.end();a++,b++){
		ans.push_back({*a,*b});
	}
	
	cout<<ans.size()<<endl;
	for(int i=0;i<ans.size();i++)cout<<ans[i].x<<" "<<ans[i].y<<endl;
	
}
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:41:40  更:2021-08-17 15:42:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/27 22:37:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码