CodeForces 990D. Graph And Its Complement

题目:点击打开链接

题意:给定a,b.要求构造一个邻接矩阵,对应的图中,有a个联通块;对应的补图有b个联通块。

分析:a>1,那么b一定为1.说明a,b中至少有一个是1.特判构造
a>1,前a-1个独立,为a-1个联通块;[a+1,n]顶点为一个联通块
a==1,b>1.构造补图的,再返回来

a==1,b==1.n=1成立,n=2,n=3不成立.n>=4,就是一个链

构造题做的太少了,看到这题毫无思路。

我的代码:

#pragma comment(linker, "/STACK:102400000,102400000")///手动扩栈
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define debug test
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
#define eps 1e-10
#define MOD 1000000007
#define PI acos(-1.0)
const int N = 1e3+10;

ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
int to[4][2]={
    {-1,0},{1,0},{0,-1},{0,1}};

int n,a,b,g[N][N];

int main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>a>>b;
    if(min(a,b)>1) cout<<"NO"<1) {
                for(int i=a;i<=n;i++) g[i][n]=g[n][i]=1;
            }else if(b>1) {
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                        g[i][j]=1;
                for(int i=b;i<=n;i++) g[i][n]=g[n][i]=1^g[n][i];
            }
            for(int i=1;i<=n;i++,cout<


参考代码:

#include 
using namespace std;
int a,b,n,res[1005][1005];

int main(){
	cin>>n>>a>>b;
	if(n==1) return cout<<"YES\n0",0;
	if(min(a,b)>1 || (n<=3 && max(a,b)==1))
		return cout<<"NO",0;
	cout<<"YES\n";
	for(int i=1+max(a,b);i<=n;++i)
		res[i-1][i] = res[i][i-1] = 1;
	for(int i=1;i<=n;++i,cout<<'\n')
		for(int j=1;j<=n;++j)
			cout<<(i==j?0:res[i][j]^(a

参考博客:https://blog.csdn.net/haipai1998/article/details/80670059

你可能感兴趣的:(ACM,codefoces,构造,思维,图论,规律)