首页 > 其他分享 >Big Clique Everywhere 题解

Big Clique Everywhere 题解

时间:2024-08-19 10:28:32浏览次数:12  
标签:return idx int 题解 st 补图 Everywhere Big

给个链接:Big Clique Everywhere

先说一下团(clique)是什么,其实就是完全图。

考虑什么情况下不满足题意。我们可以先建出补图,下面的东西都在补图中完成。

我们首先给出结论:如果该图中有奇环(不是二分图),则条件不成立,否则成立。

这里证明一下:如果存在奇环,则把点集设为这个奇环中的点,那么一定无法满足。显然我们无法同时选出两个相邻的点,因为在原图中,任意两个相邻的点之间没有边,所以一定选不出来至少一半的点。

然后就是,为什么是二分图一定有解。这里分类讨论一下:

  • 选的点在一部里面。此时这些点在补图中必然两两之间没有边,则在原图中他们构成一个团,显然合法。

  • 选的点横跨两部。此时必然有一部的点占到至少一半,对于这些点,就可以用上一种情况证明。

还有一个比较直观的事情,当 \(n\) 比较大的时候,是一定无解的。这里其实如果 \(n\ge 2002\),则直接无解。否则我们暴力建出补图,染色判断其是否为二分图即可。

代码:

#include<bits/stdc++.h>
#define int long long
#define N 200005
#define M 8001005
using namespace std;
int T,n,m,x[M],y[M],st[N];
int h[N],e[M],ne[M],idx;
bool edge[2009][2009];
void add(int a,int b){
	e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
bool dfs(int u,int c){
	st[u]=c;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(!st[j]){
			if(!dfs(j,3-c))return 0;
		}
		else if(st[j]==c)return 0;
	}
	return 1;
}
void solve(int cs){
	cin>>n>>m;
	if(n<2002){
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				edge[i][j]=0;
			}
		}
	}
	for(int i=1;i<=m;i++){
		cin>>x[i]>>y[i];
		if(n<2002)edge[x[i]][y[i]]=edge[y[i]][x[i]]=1;
	}
	if(n>=2002){
		cout<<"No\n";
		return;
	}
	idx=0;
	for(int i=1;i<=n;i++){
		h[i]=-1;
		st[i]=0;
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(!edge[i][j])add(i,j),add(j,i);
		}
	}
	bool flag=1;
	for(int i=1;i<=n;i++){
		if(!st[i]){
			if(!dfs(i,1)){
				flag=0;
				break;
			}
		}
	}
	cout<<(flag?"Yes\n":"No\n");
}
signed main(){
	cin>>T;
	for(int cs=1;cs<=T;cs++){
		solve(cs);
	}
	return 0;
}

标签:return,idx,int,题解,st,补图,Everywhere,Big
From: https://www.cnblogs.com/zxh923aoao/p/18366800

相关文章

  • 题解:AT_abc367_c [ABC367C] Enumerate Sequences
    大致题意让你按照字典序输出一些长\(n\)的序列,序列中的数字有范围,且序列和需要为\(k\)。分析直接深搜。搜索的时候对从第一个元素开始,每个元素从小到大枚举所有可能的值,这样就保证答案按照字典序升序排列。用一个vector存储序列,到达边界之后计算一遍和,判断是否满足条件,然......
  • 2024百度之星决赛部分题解(难度排序前六题)
    前言手速6题,可惜第四题磨了几个小时没磨出来,多做一题就金了,还是实力差了点,最后银牌前列。下面的题解是根据代码回忆大概的题意,主要是给出来赛时的参考代码A.状压题意:学校集训队总的有\(n\)个人,保证\(n\)是3的倍数,每个人有个人实力\(a_i\),每两个人之间有配合程度\(b_{i......
  • 叠Buff!经典麻雀优化算法+多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回
    叠Buff!经典麻雀优化算法+多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回归预测目录叠Buff!经典麻雀优化算法+多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现SS......
  • 洛谷P1983 [NOIP2013 普及组] 车站分级 题解
    思路由题可知,在一趟车次的区间内,停靠的站点的等级恒大于不停靠的站点。因此,对于每一趟车次的区间,给所有停靠的站点向所有不停靠的站点两两连有向边,然后求图中最长的路径长度,就能得到答案。实现因为可能出现重边,而且\(n\le1000\),所以在处理车次连边的时候使用邻接矩阵,再改成邻......
  • P10660 BZOJ2759 一个动态树好题 题解
    从题目名字看出此题需要用动态树解决对于任意\(i\),都有唯一的\(p_i\)与之对应,由\(p_i\)向\(i\)连边,\(n\)种关系显然构成一基环树森林。对于环上的节点,一个点可以自己表示自己,所以可以直接解出该点的权值,其他点从环上的点直接推出即可。考虑如何动态维护这个过程,一个点上......
  • 洛谷P1001题解
    洛谷P1001题解友情提示:“题目传送门”被贴在了题目编号上,请自行点击查看!主要知识点C/C++语言框架基本数据类型的定义与使用cin/cout或scanf()/prinf()的使用代码一小步,OI一大步(bushi)AC代码#include<bits/stdc++.h>typedeflonglongll; //“十年OI一场空,不开long......
  • 题解:CF1630F Making It Bipartite
    题意图上有\(n\)个点,且具有点权,点权保证互不相同,若两个点点权有倍数关系,则两点之间有一边,问你最少删去多少个点能使图变为二分图。思路因为如果\(a\)是\(c\)的倍数且\(c\)是\(b\)的个数,所以\(a\)是\(c\)的倍数。由此可以看出,若\(a\)与\(b\)相连且\(b\)与......
  • 题解:CF1034B Little C Loves 3 II
    思路看到这道题时,第一思路就是网络流,结果一看数据\(10^{9}\)直接转向找规律。主要思路:神秘特判。首先,下面的结论基于\(n\lem\)。Case1.当\(n=1\)时,易得的是我们可以以\(6\)为循环节构造。Case2.当\(n=2\)时,我们可以构造出\(4a,5a,6a\)的形式。易得,通过裴蜀......
  • ABC 367 G 题解
    ABC367G神奇题目场上想到了引入多元生成函数之后就嗝屁了。定义两个多项式的运算\(A(z)*B(z)=\sum_{i}\sum_{j}z^{i\oplusj}a_ib_j\),也就是异或卷积。定义两个二元生成函数\(A(x,y)*B(x,y)=\sum_{i,p}\sum_{j,q}x^{i\oplusj}y^{p+q}a_{i,p}b_{j,q}\)我们仍然选用\(\prod......
  • 题解:AT_abc367_d [ABC367D] Pedometer
    首先肯定要单层循环枚举元素,然后想方法求出一个元素的所有答案。一开始我写了一个二分找\(m\)倍数的方法,发现\(m\)小的时候还不如暴力。于是联想到之前做过的一道题,可以借助于取模的前缀和数组。对于当前元素\(i\),如果一个元素之前的前缀和与\(i\)之前的前缀和对\(m\)......