题目大意就是有n个点以及n个点对应的度序列,问你能不能根据这个度序列构造一个图(无向图).这题用到了Havel-Hakimi定理,一边判断一边建图,先把顶点按度数从大到小排序 ,一个度数大的顶点它后面存在度数个顶点的话,那是可以构图的,否则不行,然后度数大的点和它后面一个点(no[i].index)相连,那么no[i].du--,如果出现了-1就说明不可图了,否则可图,那么就将2点相连。
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int du,index;
}no[15];
bool cmp(const node&a,const node&b)
{
return a.du>b.du;
}
int mp[15][15];
int t,n;
bool build()
{
for(int i=1;i<=n;i++)
{
sort(no+i,no+n+1,cmp);
int d=no[i].du;
if(i+d>n) return false;
for(int j=i+1;j<=i+d;j++)
{
no[j].du--;
if(no[j].du<0) return false;
mp[no[i].index][no[j].index]=1;
mp[no[j].index][no[i].index]=1;
}
}
return true;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
memset(mp,0,sizeof(mp));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>no[i].du;
no[i].index=i;//因为后面有对no数组排序,所以需要保存每个度对应的节点的编号
}
if(build())
{
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<mp[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
else
{
cout<<"NO"<<endl<<endl;
}
}
return 0;
}