Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]

news/2024/9/18 0:23:58/文章来源:https://www.cnblogs.com/zhr0102/p/18413096

水影若深蓝:挺好的一道并查集构造题。

观察

不难发现“距离为 \(2\)”这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为 \(2\) 的点染成相同颜色。

这个染色问题就很并查集。

于是我们用并查集维护相同的种类。

显然,当图上只有一个连通块的时候,无解;否则我们一定可以找到一组解,因为一棵树一定可以进行黑白染色。

另一种理解就是距离为 \(2\) 是有传递性的。我们可以构造一个菊花,先钦定一个颜色不同的点(不在同一个连通块内),然后把某连通块所有的点与它连边,就可以让他们之间的距离全部为 \(2\)

感觉和 Parity Game 里维护奇偶性的两个连通块思路差不多,但是这题更难描述出来一些。

构造

我们选择两个处于不同连通块的祖先 \(p_1,p_2\),然后对于祖先非 \(p_1\) 的点,我们连一条向 \(p_1\) 的边;否则连 \(p_2\)

最后注意 \(p_1\) 不能连任何边即可。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
int f[300005],n,m,a[300005],b[300005];
void init()
{for(int i=1;i<=n;i++)f[i]=i;
}
int findf(int x)
{if(f[x]!=x)f[x]=findf(f[x]);return f[x];
}
void combine(int x,int y)
{int fx=findf(x),fy=findf(y);f[fx]=fy;
}
void solve()
{cin>>n>>m;init();for(int i=1;i<=m;i++){cin>>a[i]>>b[i];combine(a[i],b[i]);}bool ilg=1;for(int i=1;i<=n;i++){if(i>1)ilg=(ilg&(findf(i)==findf(i-1)));}if(ilg==1){cout<<"No"<<endl;return;}cout<<"Yes"<<endl;int p1=-1,p2=-1;for(int i=1;i<=n;i++){int fa=findf(i);if(p1==-1)p1=fa;else if(p2==-1&&fa!=p1)p2=fa;}for(int i=1;i<=n;i++){int fa=findf(i);if(i==p1)continue;if(fa==p1)cout<<i<<" "<<p2<<endl;else cout<<i<<" "<<p1<<endl;}cout<<endl;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin>>t;while(t--)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在arm64 架构上安装dotnet 8.0.8 LTS

树莓派 4B 是arm64的。 在arm64上面运行apt list dotnet是不会出来可用的dotnet的,即使apt update多次也一样。 好在dotnet 本身是支持arm/arm64 架构的,只是安装的时候不能使用apt罢了。 那么久使用scripts来进行安装好了。 wget 下载到本地之后,先 chmod +x, 就我自己的…

从0开始计算机体系结构的学习(一):FGPA预备知识与Vivado环境搭建

引入与预备知识 什么是FPGA? FPGA(Field-Programmable Gate Array,现场可编程门阵列)是一种集成电路(IC),其硬件功能可以通过用户在现场编程来定义。与传统的ASIC(专用集成电路)不同,FPGA在制造完成后仍然可以根据需求进行重新配置。因此,它们被广泛应用于需要灵活性…

WordPress加载流程的解读分析

index.php ```php <?php /** 这个文件只用来加载 /wp-blog-header.php** @package WordPindex.php ```php <?php /* * 这个文件只用来加载 /wp-blog-header.php * * @package WordPress / /* * 声明一个全局变量,用来判断是否加载主题 * * @var bool / define(WP_USE_…

C++ 虚函数表解析

一、何为多态 多态(polymorphism)指为不同数据类型的实体提供统一的接口,或使用单一的符号来表示多个不同的类型。比如我们熟悉的函数重载、模板技术,都属于多态。无论是模板还是函数重载,都是静态绑定的。也就是说,究竟该调用哪个重载函数或者说调用哪个模板类的实例化,…

8-回溯算法

参考代码随想录题目分类大纲如下:一、回溯算法理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。回溯法其实就是暴力查找,并不是什么高效的算法 回溯法的效率虽然回溯法很难,很不好理解,但是回溯法并不是…

九月

arc131 C考虑奇数情况,只有一个时先手必胜,设当前异或和为 \(S\),必输的情况是 \(\forall S \oplus a_i \in a\),这些数是一一对应的,但一共有奇数,此时先手必胜。偶数是,若第一回合无法结束游戏则变为后手,同上。 E若一个点所有边颜色相同,包含该点的环便不可能三边颜…

微信小程序开发系列10----页面配置--事件冒泡和阻止

下图点击里面,外面的事件也触发 场景:广告 点击先看广告,之后跳转到功能页面 会冒泡的事件源码获取方式(免费):(1)登录-注册:http://resources.kittytiger.cn/(2)签到获取积分(3)搜索:8-wxmleventMp事件冒泡和阻止

椭圆的第二定义

平面内到定点 \(F(c,0)\)的距离和到定直线 :\(\displaystyle l:x=\frac{a^{2}}{c}\)( 点\(F\)不在\(l\)上)的距离之比为常数\(\displaystyle \frac{a}{c}\)(即离心率\(e\),\(0<e<1\))的点的轨迹是椭圆。(即点\(P\)轨迹) 其中定点\(F\)为椭圆的焦点,定直线\(l\)称…

微信小程序开发系列9----页面配置--事件-参数传递

图点击里面,外面的事件也触发 场景:广告 点击先看广告,之后跳转到功能页面 会冒泡的事件 源码获取方式(免费):(1)登录-注册:http://resources.kittytiger.cn/(2)签到获取积分(3)搜索:7-wxmleventparameter事件-参数传递

NSSM使用方法/使用NSSM把.Net Core部署至 Windows 服务

使用NSSM把.Net Core部署至 Windows 服务 NSSM使用简介1、官网http://www.nssm.cc/,下载地址http://www.nssm.cc/download 2、下载后解压到自己喜欢的目录如:F:\work\nssm-2.24\win643、以管理员权限打开命令行工具,切换到nssm.exe所在路径,运行 nssm install,打开程序配置…

使用NSSM把.Net Core部署至 Windows 服务

使用NSSM把.Net Core部署至 Windows 服务 NSSM使用简介1、官网http://www.nssm.cc/,下载地址http://www.nssm.cc/download 2、下载后解压到自己喜欢的目录如:F:\work\nssm-2.24\win643、以管理员权限打开命令行工具,切换到nssm.exe所在路径,运行 nssm install,打开程序配置…