D. Graph And Its Complement(构造)

看 到 这 道 题 居 然 一 点 思 路 都 没 有 . . . . . . 看到这道题居然一点思路都没有...... ......

关键就是假设构造了一个有a个连通分量的矩阵

现 在 取 它 的 补 图 , 就 相 当 于 每 个 集 合 的 每 个 点 向 其 他 所 以 集 合 连 一 条 边 现在取它的补图,就相当于每个集合的每个点向其他所以集合连一条边 ,

所 以 补 图 不 就 相 当 于 所 有 点 连 成 一 片 , 连 通 分 量 为 1 吗 ? 所以补图不就相当于所有点连成一片,连通分量为1吗? ,1?

那 么 a 和 b 一 定 有 一 个 是 1 那么a和b一定有一个是1 ab1

Ⅰ . a 和 b 都 是 1 \color{Red}Ⅰ.a和b都是1 .ab1

那 么 当 n = 1 时 特 判 Y E S 那么当n=1时特判YES n=1YES

当 n > = 4 时 , 连 成 一 条 链 像 1 − 2 , 2 − 3 , 3 − 4 等 等 当n>=4时,连成一条链像1-2,2-3,3-4等等 n>=4,12,23,34

Ⅱ . a 和 b 有 一 个 是 1 \color{Red}Ⅱ.a和b有一个是1 .ab1

那 么 先 构 造 那 个 不 是 1 的 那么先构造那个不是1的 1

然 后 如 果 b 不 是 1 那 么 就 取 反 就 行 然后如果b不是1那么就取反就行 b1

#include 
using namespace std;
const int maxn=1009;
int n,a,b;
int t[maxn][maxn];
void fan(){
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
		if( i!=j )	t[i][j]^=1;
}
void print(){
	cout<<"YES"<>n>>a>>b;
	if(a!=1&&b!=1)	cout<<"NO";
	else if(a==1&&b==1)
	{
		if(n>1&&n<=3)	cout<<"NO";
		else//构造一条链 
		{
			for(int i=2;i<=n;i++)	t[i-1][i]=t[i][i-1]=1;
			print();
		}	
	}
	else
	{
		int temp=0;
		if(a!=1)	temp=a;
		if(b!=1)	temp=b;
		for(int i=1;i<=n-temp+1;i++)
		for(int j=i+1;j<=n-temp+1;j++)
			if(i!=j)	t[i][j]=t[j][i]=1;
		if(b!=1)	fan();
		print();
	}
}

你可能感兴趣的:(CF刷题计划)