这个题根据Havel-Hakimi定理中的方法进行判断,然后直接模拟就行了~
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=11; struct node { int val; int index; bool operator < (const node& a)const { return val>a.val; } }a[maxn]; int n,ans[maxn][maxn]; int main() { int T; scanf("%d",&T); while(T--) { memset(ans,0,sizeof(ans)); scanf("%d",&n); int len=n-1; for(int i=0;i<n;i++) { scanf("%d",&a[i].val); a[i].index=i+1; } sort(a,a+n); int flag=0; for(int i=0;i<n;i++) { for(int j=1;j<=a[0].val&&j<=len;j++) { ans[a[0].index][a[j].index]=1; ans[a[j].index][a[0].index]=1; a[j].val--; } swap(a[0],a[len--]); sort(a,a+len+1); for(int j=0;j<=len;j++) if(a[j].val<0) { flag=1; break; } if(flag) break; } if(flag) { printf("NO\n"); printf("\n"); continue; } printf("YES\n"); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) printf("%d%c",ans[i][j],j==n?'\n':' '); printf("\n"); } return 0; }