//用到了Havel-Hakimi定理,判断是否能够构图 //两种情况不能构图,1:对剩下序列排序后,最大的度数超过了剩下的顶点数 // 2:对最大的度数后面的f个度数减-后,出现了负数 //记录到临街矩阵只需要每次排序后减-记录。 #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 20 struct node { int u,index; } a[N]; int ma[N][N]; int cmp(const void *a,const void *b) { return (*(struct node *)b).u-(*(struct node *)a).u; } int main() { int t,n,i,j,flag,to,index; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0; i<n; i++) { scanf("%d",&a[i].u); a[i].index=i+1; } flag=1; memset(ma,0,sizeof(ma)); for(i=0; i<n&&flag; i++) { qsort(a+i,n-i,sizeof(a[0]),cmp); to=a[i].u; index=a[i].index; if(to>n-i-1)flag=0; for(j=i+1; j<n&&flag; j++) { if(to==0)break; if(a[j].u<=0)flag=0; a[j].u--; to--; ma[index][a[j].index]=ma[a[j].index][index]=1; } } if(flag==0) printf("NO "); else { printf("YES "); for(i=1; i<=n; i++) { for(j=1; j<=n-1; j++) printf("%d ",ma[i][j]); printf("%d ",ma[i][j]); } } if(t) printf(" "); } return 0; }