题意:给出 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()
{
}