题目意思是,给定一个度数列,判断这个度数列是否可以构成一个无向图。
根据Havel-Hakimi定理判断是否可图,再贪心构图即可。
#include<algorithm>
using namespace std;
const int M=20;
struct node
{
int degree;
int num;
bool operator < (const node a)const
{
return a.degree<degree;
}
}v[M];
bool mp[M][M];
int n;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(mp,0,sizeof(mp));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i].degree);
v[i].num=i;
}
bool flag=true;
for(int i=1;i<=n;i++)
{
sort(v+1,v+n+1);
int u=v[1].num;
int temp=v[1].degree;
v[1].degree=0;
for(int j=2;j<=1+temp;j++)
{
v[j].degree--;
int t=v[j].num;
if(v[j].degree<0)
{
flag=false;break;
}
mp[u][t]=1;
mp[t][u]=1;
}
if(!flag) break;
}
if(!flag)
puts("NO");
else
{
puts("YES");
for(int i=1;i<=n;i++)
{
for(int j=1;j<n;j++)
printf("%d ",mp[i][j]);
printf("%d",mp[i][n]);
puts("");
}
}
printf("\n");
}
return 0;
}