Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]
水影若深蓝:挺好的一道并查集构造题。
观察
不难发现“距离为 \(2\)”这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为 \(2\) 的点染成相同颜色。
这个染色问题就很并查集。
于是我们用并查集维护相同的种类。
显然,当图上只有一个连通块的时候,无解;否则我们一定可以找到一组解,因为一棵树一定可以进行黑白染色。
朴素想法
注意到每次连边只能连两个颜色不同的点的边,并且还要满足某些点之间距离为 \(2\) 的限制,我们考虑一个暴力连边。
每次用并查集合并完颜色后,我们重新遍历一遍那些限制,然后扫一遍所有点,找到一个与他们颜色不同的点,分别向他们连一条边。
然后剩下的点因为没有限制,所以瞎几把乱连就好,这个和 MST 一样的实现方式。
但这样是 \(O(n^2)\) 的,过不了。
优化
因为同一个连通块里的点可以找同一个中转点,所以我们可以构造一个菊花,先钦定一个颜色不同的点(不在同一个连通块内),然后把某连通块所有的点与它连边,就可以让他们之间的距离全部为 \(2\)。
构造
进一步优化,可以发现我们只要找到两个不同集合里的点就好了,不用对于每个连通块一个一个找中转点。
我们选择两个处于不同连通块的祖先 \(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;
}
Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]的更多相关文章
- Luogu P2391 白雪皑皑 && BZOJ 2054: 疯狂的馒头 并查集
4月的时候在luogu上做过 白雪皑皑 这道题,当时一遍AC可高兴了qwq,后来去了个厕所,路上忽然发现自己的做法是错的qwq...然后就咕咕了qwq 今天看到了 疯狂的馒头 ,发现一毛一样OvO.. ...
- luoguP1525 关押罪犯 题解(NOIP2010)(并查集反集)
P1525 关押罪犯 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...
- 【HNOI2012】永无乡 题解(并查集+线段树合并)
题目链接 给定一张含$n$个点$m$条边的无向图,每个点有一个重要指数$a_i$.有两种操作:1.在$x$和$y$之间连一条边:2.求$x$所在连通块中重要程度第$k$小的点. ----------- ...
- Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1)A B C 水 并查集 思路
A. Bear and Big Brother time limit per test 1 second memory limit per test 256 megabytes input stand ...
- 并查集+时光倒流 || [JSOI2008]星球大战starwar || BZOJ 1015 || Luogu P1197
题面:P1197 [JSOI2008]星球大战 题解: 坑点有点多啊,加上我本来就有点头昏脑涨,一道水题写了一万年.. 并查集不支持拆开(但是可以撤销合并),只支持合并.所以把询问离线了,从最后状态到 ...
- Codeforces Round #385 (Div. 2)A B C 模拟 水 并查集
A. Hongcow Learns the Cyclic Shift time limit per test 2 seconds memory limit per test 256 megabytes ...
- Codeforces Round #396 (Div. 2) A B C D 水 trick dp 并查集
A. Mahmoud and Longest Uncommon Subsequence time limit per test 2 seconds memory limit per test 256 ...
- java打印正金字塔,倒金字塔和“水影”金字塔
java打印正金字塔,倒金字塔和"水影"金字塔 --------原创文章,若要转载,请注明出处 小小少年 闲来无事,想起自己初学java的时候做的经典的无非就是打印出一些有意思 ...
- 【luogu P1955 [NOI2015]程序自动分析】 题解
题目链接:https://www.luogu.org/problemnew/show/P1955 并查集操作,1e9要离散化,数组要开大一些,操作前先执行合并操作 样例好毒啊(全是排好序的) #inc ...
- 【luogu P2195 HXY造公园】 题解
题目链接:https://www.luogu.org/problemnew/show/P2195 fir.吐槽题目(省略1w字 sec.考虑对一个森林的维护,每棵树用并查集维护. 操作1:输出当前查询 ...
随机推荐
- linux下的rpm与yum
一.源代码形式 1. 绝大多数开源软件都是直接以原码形式发布的 2. 源代码一般会被打成.tar.gz的归档压缩文件 3. 源代码需要编译成为二进制形式之后才能够运行使用 ...
- Winform跨线程访问报错问题解决
` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...
- 零基础学习人工智能—Python—Pytorch学习(十二)
前言 本文介绍使用神经网络进行实战. 使用的代码是<零基础学习人工智能-Python-Pytorch学习(九)>里的代码. 代码实现 mudule定义 首先我们自定义一个module,创建 ...
- Vulnhub经典靶机:from_sqli_to_shell_i386入门靶机
靶机官网: https://www.vulnhub.com/entry/pentester-lab-from-sql-injection-to-shell,80/ 靶机镜像ISO下载地址:(转链) f ...
- 4.4 服务器上的 Git - 配置服务器
配置服务器 我们来看看如何配置服务器端的 SSH 访问. 本例中,我们将使用 authorized_keys 方法来对用户进行认证. 同时我们假设你使用的操作系统是标准的 Linux 发行版,比如 U ...
- Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流
一.前言 音视频组件除了支持保存MP4文件外,同时还支持保存裸流即264/265文件,以及解码后最原始的yuv文件.在实际使用过程中,会发现部分视频文件保存的裸流文件,并不能直接用播放器播放,查阅资料 ...
- Gitea搭建
关闭注册 找到gitea的配置文件gitea/conf/app.ini,把下面的设置改为true即可: [service] DISABLE_REGISTRATION = true 关闭openid [ ...
- HUAWEI MindStudio安装配置
HUAWEI MindStudio安装配置 官网: 链接 安装流程 获取软件包 软件包 说明 获取链接 MindStudio_{version}_linux.tar.gz MindStudio软件包, ...
- SQL优化——深分页&排序
问题背景 在开发 Web 应用或处理数据库查询时,分页是一项常见需求.然而,当面对深度分页(即页码较大,偏移量较高的分页情况)时,性能问题往往接踵而至.比如对一些需要拉特定的页面查询.范围导出.范围计 ...
- Java生成Word文档之 XDocReport 和 Poi-tl
近期参与的多个项目中,均涉及根据预定义模板生成Word文档以供前端下载的需求.以往,我们通常采用将Word文档转换为XML格式,并通过代码赋值变量的方式来实现这一功能.尽管此方法在技术层面可行,但当面 ...