首页 > 其他分享 >CF1702E 题解

CF1702E 题解

时间:2023-08-01 23:22:05浏览次数:42  
标签:le 多米诺骨牌 每个 题解 maxn CF1702E 集合 define

题意

\(t\)组数据($1 \le t \le 10^{4} $),每组数据给一个偶数 \(n\)(\(2 \le n \le 2 \cdot 10^{5}\)),有 \(n\) 个多米诺骨牌 ,每块多米诺骨牌包含两个整数 \(a_{i}\) 和 \(b_{i}\) (\(1 \le a_{i},b_{i} \le n\)),要求把这 \(n\) 块多米诺骨牌分入两个集合使得每个集合中的数互不相同,每个多米诺骨牌都必须被分入一个集合。

解题思路

由题意得每个集合中有 \(n\) 个数,每个数互不相同且都在 \(1\) 和 \(n\) 之间,所以 \(1\) 到 \(n\) 之间的每个数都会在每个集合中出现且只出现一次,因此总共的 \(2 \cdot n\) 个数中,\(1\) 到 \(n\) 都出现两次,所以如果有同一个数出现的次数不等于 \(2\) 的数据,就可以直接输出 NO

有题目可以得到一个显然的结论:如果有两块多米诺骨牌都包含同一个数,那它们一定不在同一个集合中。

有这样的关系,还有这题两个集合,就很容易想到二分图

可以把多米诺骨牌的编号作为节点编号,由于每个数出现两次,所以对于包含同一个数的第 \(i\) 块和第 \(j\) 块多米诺骨牌(\(1 \le i,j \le n\) 且 \(i \neq j\)),在编号为 \(i\) 的节点和编号为 \(j\) 的节点之间连双向边。很明显相邻的两个点不会分到同一个集合中。

建好图后就可以用染色法跑一遍二分图判定。具体来说就是用黑白两种颜色标记图中的点,如果一个点被标记了,那它周围的点都要被标记上相反的颜色(在此题中就表示分到另一个集合)。如果染色过程中出现矛盾,就说明无法按照题目要求分成两个集合,所以输出 NO ,反之输出 YES 。此题解用 bfs 实现。

Code

#include<bits/stdc++.h>
#define maxn 200010
#define pii pair<int,int>
#define fi first
#define sc second
using namespace std;
int T,n,c[maxn],flag; pii a[maxn];
vector<int> g[maxn],p[maxn];
bool check(){ //二分图判定(染色法)
	queue<int> q;
	memset(c,0,sizeof(c)); //初始时都没有颜色
	for(int i=1;i<=n;i++){
		if(!c[i]){ //如果没有被染过色
			q.push(i); c[i]=1; //放入队列,先染上颜色1
			while(!q.empty()){ //bfs枚举相邻的点
				int x=q.front(); q.pop();
				for(int j=0;j<g[x].size();++j){
					int y=g[x][j];
					if(!c[y]){ //没染过色
						q.push(y);
						if(c[x]==1) c[y]=2;
						else c[y]=1; //染上相反的颜色并放入队列
					}
					else if(c[y]==c[x]) return false; //出现矛盾,不是二分图
				}
			}
		}
	}
	return true;//染色成功,是二分图
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n); flag=0;
		for(int i=1;i<=n;++i){
			g[i].clear(); p[i].clear(); //多测不清空,爆零两行泪
		}
		for(int i=1;i<=n;++i){
			scanf("%d%d",&a[i].fi,&a[i].sc);
			p[a[i].fi].push_back(i);
			p[a[i].sc].push_back(i); //p[i]表示包含i的多米诺骨牌的编号
		}
		for(int i=1;i<=n;++i)
			if(p[i].size()!=2) flag=1; //判定是否所有数都出现2次
		if(flag){
			puts("NO"); continue;
		}
		for(int i=1;i<=n;++i){
			g[p[i][0]].push_back(p[i][1]);
			g[p[i][1]].push_back(p[i][0]); //建图
		}
		if(check()) puts("YES"); //二分图判定
		else puts("NO");
	}
	return 0;
}

标签:le,多米诺骨牌,每个,题解,maxn,CF1702E,集合,define
From: https://www.cnblogs.com/wonderfish/p/17599420.html

相关文章

  • 题解 P9489【ZHY 的表示法】
    容易想到将所求差分,变为\([1,r]\)的答案减去\([1,l-1]\)的答案。直觉告诉我们所谓的“实数\(y\)”就是没事闲的,其实只需要整数就可以。然后这种酷似整除分块的结构提示我们很多\(y\)的取值都是多余的,只需要保留所有是\(x_i\)的倍数的取值就做到了不重不漏。要求\([1,k......
  • Codeforces Round 885 (Div. 2) 题解
    A.VikaandHerFriends看一下样例就可以发现,Vika以及她的朋友都不能走对角线,在这种情况下Vika和朋友的距离为偶数,且朋友一定追不上Vika所以直接判断Vika和朋友的距离是否都为偶数即可B.VikaandtheBridge显然贪心,枚举颜色,找到相邻距离最大的两块木板,记该距离为\(......
  • ARC089B 题解
    problem&blog。给一个比较暴躁的做法。若要求\((x,y)\)的颜色为White,等价于要求\((x+k,y)\)的颜色为Black;要求\((x,y)\)的颜色为Black,等价于要求\((x\bmod2k,y\bmod2k)\)为Black。于是将全部点以黑点的形式塞到左上角\(2k\times2k\)矩阵里。枚举黑白的「分......
  • Codeforces Round 887 (Div. 2) 题解
    A.Desorting题目的核心操作就是选定一个位置\(i\),使得:对于所有\(j\lei\),\(a_j\leftarrowa_j+1\)对于所有\(j>i\),\(a_j\leftarrowa_j-1\)这样一来,操作后\(a_{i+1}-a_i\)的值就会\(-2\)因为\(a_{i+1}-a_i<0\)时,也意味着\(a_i>a_{i+1}\),所以就达到了要求那么题......
  • RTSP流媒体服务器LntonNVR(源码版)平台硬件设备拔电关闭后不能自动重启的问题解决方案
    LntonNVR视频边缘计算网关可以放置在项目现场,7x24小时不间断使用,通电联网即可成功运行,部署操作十分简单。我们在测试时,将LntonNVR注册到服务启动,拔掉硬件设备的电源后,再次恢复供电,发现LntonNVR服务并没有再次启动。对此我们也进行了分析与排查。排查步骤如下:1、首先检查是否已经......
  • 【题解】Luogu[P2420] 让我们异或吧
    Link看到是树,又多组询问,立马想到类似的求和问题,异或不好理解,我们想求和怎么做,维护\(dis_i\)表示\(i\)节点到根的权值和,那么对于\(u,v\)两点路径上的权值和就是\(dis_u+dis_v-2\timesdis_{\mathrm{lca}(u,v)}\),这是很经典的问题了。事实上刚才的求和我们可以转化一下,我们......
  • 国标GB28181视频平台LntonGBS(源码版)国标平台出现报错“缺失dll文件”的问题解决方案
    LntonGBS是基于国标GB28181协议的视频云服务平台,它可以支持国标协议的设备接入,在视频能力上能实现直播、录像存储、检索与回放、云台控制、告警上报、语音对讲、平台级联等功能,既能作为业务平台使用,也能作为能力层平台调用。技术人员在用户服务器部署LntonGBS平台,提示缺失某个dll文......
  • P2216 理想的正方形 题解
    P2216理想的正方形(为什么要写这篇题解?因为我β搞的心态炸了)食用此题解所需:有基础的双端队列知识与一只可爱的\(C++\)传送门:起飞!1.思考嗯,一看数据范围,\(a,b\leq1,000\),就知道这道题一定是一道\(\operatorname{O}(ab)\)的题(因为输入就已经达到\(100,000\)级别了,就算......
  • 国标GB28181视频平台LntonGBS(源码版)国标视频平台大屏播放时出现数据未推送的问题解决
    LntonGBS平台实现视频直播、转码与分发、平台级联、云台控制等,拥有灵活丰富的视频能力。平台基于云边端一体化架构,在很多场景中均有落地项目应用,如智慧工地、智慧安防、智慧工厂、智慧园区等。近期有用户反馈其定制版LntonGBS平台现场播放24路上大屏时有部分通道存在30秒左右出现未......
  • P9481 [NOI2023] 贸易 题解
    题目链接题目要求我们求出任意两点间最短路径之和,由于图比较特殊,除树边外只有祖先到其子树内的边,我们首先考虑最短路径有没有什么特殊性质。注意到两点之间的最短路分为一下三种:节点到其祖先的最短路:直接沿着树边向上走即可,否则一定会走多余的边,不是最优。节点到其子树的......