Description
未名湖附近共有N個大小湖泊L1, L2, ..., Ln(其中包括未名湖),每個湖泊Li裡住著一隻青蛙Fi(1 ≤
i≤ N)。如果湖泊Li和Lj之間有水路相連,則青蛙Fi和Fj互稱為鄰居。現在已知每隻青蛙的鄰居數目x1,
x2, ..., xn,請你給出每兩個湖泊之間的相連關係。
Input
第一行是測試資料的組數T(0 ≤ T≤ 20)。每組資料包括兩行,第一行是整數N(2 < N< 10),第二行是N個整數,x1,
x2,..., xn(0 ≤ xi≤ N)。
Output
對輸入的每組測試資料,如果不存在可能的相連關係,輸出"NO"。否則輸出"YES",並用N×N的矩陣表示湖泊間的相鄰關係,即如果湖泊i與湖泊j之間有水路相連,則第i行的第j個數字為1,否則為0。每兩個數字之間輸出一個空格。如果存在多種可能,只需給出一種合格情形。相鄰兩組測試資料之間輸出一個空行。
Sample Input
3
7
4 3 1 5 4 2 1
6
4 3 1 4 2 0
6
2 3 1 1 2 1
Sample Output
YES
0 1 0 1 1 0 1
1 0 0 1 1 0 0
0 0 0 1 0 0 0
1 1 1 0 1 1 0
1 1 0 1 0 1 0
0 0 0 1 1 0 0
1 0 0 0 0 0 0
NO
YES
0 1 0 0 1 0
1 0 0 1 1 0
0 0 0 0 0 1
0 1 0 0 0 0
1 1 0 0 0 0
0 0 1 0 0 0
////////////////////////////////////////////////////////////////////////////////////
#include<iostream>using namespace std;#include<algorithm>const int N=100;class V{public:int degree;int index;}v[N];int cmp(V a,V b){return a.degree>b.degree;}int main(){int r,k,p,q;int i,j;int d1;int T,n;int Edge[N][N],flag;cin>>T;while(T--){cin>>n;for(i=0;i<n;i++)//記錄頂點的度數和表明各頂點的序號{cin>>v[i].degree;v[i].index=i;}memset(Edge,0,sizeof(Edge));flag=1;for(k=0;k<n&&flag;k++)//判斷是否是可圖的 並且求出鄰接矩陣{sort(v+k,v+n,cmp);i=v[k].index;d1=v[k].degree;if(d1>n-k-1)flag=0;for(r=1;r<=d1&&flag;r++){j=v[k+r].index;if(v[k+r].degree<=0)flag=0;v[k+r].degree--;Edge[i][j]=Edge[j][i]=1;}}if(flag)//寫出鄰接矩陣{cout<<"YES"<<endl;for(p=0;p<n;p++){for(q=0;q<n;q++){if(q!=n-1)cout<<Edge[p][q]<<' ';elsecout<<Edge[p][q]<<endl;}}}elsecout<<"NO"<<endl;if(T)cout<<endl;}return 0;}