Codeforces 990D Graph And Its Complement 【构造】【性质】

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int n,a,b,count=1;
 5 int edge[1005][1005];
 6 
 7 int main(){
 8     cin>>n>>a>>b;
 9     if(a!=1 && b!=1){//补图和原图至少一个联通 
10         cout<<"NO"; 
11         return 0;
12     }
13 
14     if(a!=1){//构造一个有a个联通分量的图
15         a--;
16         while(a--){
17             for(int i=1;i<=n;i++) edge[count][i]=edge[i][count]=0;//这个点是一个联通分量
18             count++; 
19         }
20         for(int i=count+1;i<=n;i++) edge[count][i]=edge[i][count]=1;//这个点跟剩下的点组成一个无环连通分量
21         cout<<"YES"<<endl;
22         for(int i=1;i<=n;i++){
23             for(int j=1;j<=n;j++) cout<<edge[i][j];
24             cout<<endl;
25         }
26         return 0;
27     }
28     if(b!=1){//构造一个有b个联通分量的图
29         b--;
30         while(b--){
31             for(int i=1;i<=n;i++) edge[count][i]=edge[i][count]=0;//这个点是一个联通分量
32             count++; 
33         }
34         for(int i=count+1;i<=n;i++) edge[count][i]=edge[i][count]=1;//这个点跟剩下的点组成一个无环连通分量
35         cout<<"YES"<<endl;
36         for(int i=1;i<=n;i++){
37             for(int j=1;j<=n;j++) {
38                 if( i==j ) cout<<0;
39                 else cout<<!edge[i][j];
40             }
41             cout<<endl;
42         }
43         return 0;
44     }
45     
46     if(a==1 && b==1 && n>=4){
47         int connect=1;
48         for(int i=2;i<=n;i++){
49             edge[connect][i]=edge[i][connect]=1;
50             connect=i;
51         }
52         cout<<"YES"<<endl;
53         for(int i=1;i<=n;i++){
54             for(int j=1;j<=n;j++) cout<<edge[i][j];
55             cout<<endl;
56         }    
57         return 0;
58     }
59     
60     if(a==1 && b==1){
61         if(n==1) cout<<"YES"<<endl<<0;
62         else cout<<"NO";
63     }
64     return 0;
65 }

猜你喜欢

转载自www.cnblogs.com/ZhenghangHu/p/9165731.html
今日推荐