D. 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,就是一個鍊
#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
#define debug puts
#define setp cout << fixed << setprecision(3)
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
const int N=1e3+3;
const int MOD=1e9+7;
const ll INF=1e18+8;
int ans[N][N];
int main(void){
FAST_IO;
int n,a,b;
cin >>n >> a>>b;
if(a!=1&&b!=1){
cout <<"NO"<<endl;
return 0;
}
if(a!=1){
for(int i=a+1;i<=n;i++){
ans[a][i]=ans[i][a]=1;
}
}
else if(b!=1){
for(int i=b+1;i<=n;i++){
ans[b][i]=ans[i][b]=1;
}
cout <<"YES"<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) cout << 0;
else if(ans[i][j]) cout << 0;
else cout << 1;
}
cout <<"\n";
}
return 0;
}
else if(a==1&&b==1){
if(n==1){
}
else if(n==2||n==3){
cout <<"NO"<<endl;
return 0;
}
else{
int now=1;
for(int i=2;i<=n;i++){
ans[i][now]=ans[now][i]=1;
now=i;
}
}
}
cout <<"YES"<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) cout <<ans[i][j];
cout<<"\n";
}
return 0;
}