http://poj.org/problem?id=1659
Havel-Hakimi定理
<1>.判断度序列是否可图---两种不可图的情况:
(1).某次对剩下的序列排序后,最大的度序列d1超过了剩下的顶点数;
(2).对最大度序列后的d1个数各减1后,出现了负数;
<2>.根据可图度序列构造出一个图并用邻接矩阵表示出来:
(1).声明一个vertex结构体,确保顶点序号与输入时的度数顺序一致;
(2).每次对剩下的顶点按度从大到小的顺序排序后,对最前面一个度数为d1的顶点之后的d1个顶点的度数各减1,并连边;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 15
struct vertex
{
int degree,dxh;
}V[N];
int cmp(const void *a,const void *b)
{
return ((vertex*)b)->degree-((vertex*)a)->degree;
}
int main()
{
int T,n;
int i,j,k,r;
int flag,d1;
int edge[N][N];
scanf("%d",&T);
while(T--)
{
memset(edge,0,sizeof(edge));
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&V[i].degree);
V[i].dxh=i;
}
flag=1;
for(k=0;k<n&&flag;k++)
{
qsort(V+k,n-k,sizeof(vertex),cmp);
i=V[k].dxh;
d1=V[k].degree;
if(d1>n-k-1)
flag=0;
for(r=1;r<=d1&&flag;r++)
{
j=V[k+r].dxh;
if(V[k+r].degree<=0)
flag=0;
V[k+r].degree--;
edge[i][j]=edge[j][i]=1;
}
}
if(flag)
{
puts("YES");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j) printf(" ");
printf("%d",edge[i][j]);
}
puts("");
}
}
if(!flag)
puts("NO");
if(T)
puts("");
}
return 0;
}