给出每个点邻接点的数量,求出邻接矩阵。
维护一个堆,不断弹出根,减去后面每个值。
// ShellDawn
// 2019-07-10
// POJ1659
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstring>
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
struct Node{
int id;
int v;
Node(int a,int b):id(a),v(b){}
bool operator < (const Node& a) const {
if(this->v < a.v) return true;
return false;
}
};
int N;
priority_queue<Node> q;
queue<Node> p;
int ans[12][12];
int main(){
int T;
scanf("%d",&T);
for(int TT = 0;TT < T;++TT){
if(TT!=0) puts("");
MM(ans);
scanf("%d",&N);
for(int i=0;i<N;++i){
int t;
scanf("%d",&t);
if(t!=0) q.push(*(new Node(i,t)));
}
bool flag = true;
while(!q.empty()){
int id = q.top().id;
int v = q.top().v;
q.pop();
for(int i=0;i<v;++i){
if(q.empty()){
flag = false;
while(!p.empty()) p.pop();
break;
}
int nowid = q.top().id;
int nowv = q.top().v;
q.pop();
ans[id][nowid] = ans[nowid][id] = 1;
if(nowv>1) p.push(*(new Node(nowid,nowv-1)));
}
while(!p.empty()){
q.push(p.front());
p.pop();
}
}
if(flag){
puts("YES");
for(int i=0;i<N;++i){
for(int j=0;j<N;++j){
printf("%d%s",ans[i][j],j==N-1?"\n":" ");
}
}
}else{
puts("NO");
while(!q.empty()) q.pop();
}
}
return 0;
}