http://poj.org/problem?id=1659
定理:1,先把点的度按照递减(可以等于)顺寻排列;
2,然后 把第一个点的度计为n,以后的n个数都减去1,
3,然后排序,把第二个点的度计做你,以后n个数都减去1;
4,到出现-1时,为否,都为0时,为是;
还有一种条件为:如果n大于等于后面点的数时,也为否,
我就错在了这个地方
一下为我的代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct ele
{
int W;
int V;
}p[25];
bool cmp(ele x,ele y)
{
return x.W>y.W;
}
int main()
{
bool mark=false;
int mat[25][25];
int i,j,k;
int T;
int n;
int flag;
scanf("%d",&T);
while(T--)
{
memset(mat,0,sizeof(mat));
flag=false;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&p[i].W);
p[i].V=i;
}
for(i=0;i<n;i++)
{
sort(p+i,p+n,cmp);
for(j=i+1;j<=i+p[i].W;j++)
{
k=n-i;
if(p[j].W>=k)
{
flag=true;
break;
}
p[j].W--;
mat[p[i].V][p[j].V]=mat[p[j].V][p[i].V]=1;
if(p[j].W<0)
{
flag=true;
break;
}
}
if(flag)
break;
}
if(mark)
printf("\n");
else
mark=true;
if(flag)
printf("NO\n");
else
{
printf("YES\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(j==n-1)
printf("%d\n",mat[i][j]);
else
printf("%d ",mat[i][j]);
}
}
return 0;
}