1. 程式人生 > >Educational Codeforces Round 45 (Rated for Div. 2) D

Educational Codeforces Round 45 (Rated for Div. 2) D

題意

給你三個數n,a,b,表示有n個點,要你輸出一個無向圖,a個強連通塊,你輸出的圖的補圖有b個強連通塊,什麼是補圖? 就是所有點都連遍的完全圖,減去當前圖的邊。 模一下就可以發現a,b至少有一個是1,因為有對角線的存在,但是如果a,b都是1的時候,由於n=2,3的時候沒有對角線,那麼就是不可以的。a!=1&&b!=1的時候也是不可以的,a=1的時候,for 1<=i<=b-n,只要去掉與i相鄰的邊就好了,b=1的時候,for 1<=i<=n-1 只需要加上與i相鄰的邊就好了。

#include<bits/stdc++.h>
using namespace std;
int
Map[1005][1005]; int main() { int n,a,b; scanf("%d%d%d",&n,&a,&b); for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) { if(i==j) continue; Map[i][j]=Map[j][i]=1; } } if(a==1&&b==1) { if
(n==1||n>=4) { printf("YES\n"); for(int i=1;i<n;i++) Map[i][i+1]=Map[i+1][i]=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) printf("%d",Map[i][j]); printf("\n"); } } else
printf("NO\n"); } else if(a==1) { printf("YES\n"); for(int i=1;i<=n-b;i++) Map[i][i+1]=Map[i+1][i]=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) printf("%d",Map[i][j]); printf("\n"); } } else if(b==1) { printf("YES\n"); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) Map[i][j]=0; for(int i=1;i<=n-a;i++) Map[i][i+1]=Map[i+1][i]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) printf("%d",Map[i][j]); printf("\n"); } } else printf("NO\n"); return 0; }