题意:给出 n 个点的度数 , 问这n个点能不能组成一个无向图 , 输出其邻接矩阵
解法:直接调用Havel-Hakimi定理
代码:
#include
#include
#include
#include
using namespace std;
#define maxn 20
int grap[maxn][maxn] , du[maxn];
int n;
int pre[maxn];
void init()
{
memset(grap , 0 , sizeof(grap));
}
bool cmp(int x , int y)
{
return du[x] > du[y];
}
int main()
{
int t;
cin>>t;
while(t--)
{
init();
scanf("%d" , &n) ;
int i , j ;
for(i = 1; i <= n; i++)
{
scanf("%d" , &du[i]);
pre[i] = i;
}
bool xy = false;
int x , y ;
int g = n;
while(g--)
{
sort(pre+1 , pre+n+1 , cmp);
x = pre[1];
if(du[x] == 0)
break;
for(j = 2; j <= du[x]+1 ; j++)
{
y = pre[j];
if(--du[y] < 0)
{
xy = true;
break;
}
grap[x][y] = grap[y][x] = 1;
}
du[x] = -1;
if(xy)
break;
}
if(xy)
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
for(i = 1; i <= n; i ++)
{
cout<<grap[i][1];
for(j = 2; j <= n; j++)
printf(" %d" , grap[i][j]);
cout<<endl;
}
}
if(t)
cout<<endl;
}
return 0;
}
解法:直接调用Havel-Hakimi定理
代码:
#include
#include
#include
#include
using namespace std;
#define maxn 20
int grap[maxn][maxn] , du[maxn];
int n;
int pre[maxn];
void init()
{
}
bool cmp(int x , int y)
{
}
int main()
{
}