链接
[http://poj.org/problem?id=1659]
题意
略
分析
(Havel-Hakimi定理) 贪心就好了
代码
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=15;
struct str{
int degree;
int index;
}v[N];
bool cmp(str a,str b){
return a.degree>b.degree;
}
int main(){
int edge[N][N];
int t,n,i,j;
//freopen("in.txt","r",stdin);
cin>>t;
while(t--){
cin>>n;
memset(edge,0,sizeof(edge));
for(i=0;i<n;i++){
cin>>v[i].degree;
v[i].index=i;
}
bool flag=1;
sort(v,v+n,cmp);
int pos=0;
while(v[pos].degree&&flag){
if(v[pos].degree>n-1-pos){
flag=0;
break;
}
else{
for(i=1;i<=v[pos].degree&&flag;i++)
{
v[pos+i].degree--;
if(v[pos+i].degree<0){
flag=0;
break;
}
int x=v[pos].index,y=v[pos+i].index;
edge[x][y]=1,edge[y][x]=1;
}
pos++;
if(flag) sort(v+pos,v+n,cmp);
}
}
if(!flag) cout<<"NO\n";
else{
cout<<"YES\n";
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j==0) cout<<edge[i][j];
else cout<<' '<<edge[i][j];
}
cout<<endl;
}
}
if(t) cout<<endl;
}
return 0;
}